Pregunta

Estoy tratando de agregar una barra de desplazamiento vertical para mi TextField y TextArea. Estoy utilizando un ScrollPane y se debería crear avertical / barra de desplazamiento horizontal por defecto.

Problema: Necesito una barra de desplazamiento vertical para ver los datos que no es visible. En el principio una barra de desplazamiento vertical aparece, pero cuando los datos aumenta los cambios de desplazamiento vertical a una barra de desplazamiento horizontal. También el campo de texto desaparece y sólo una barra de desplazamiento horizontal aparece en su lugar. Supongo que se debe a la forma en que he establecido los límites pero intentado cambiar los límites y se termina haciendo elimina por completo el campo de texto.

Mi fragmento de código:

public JTextField inputField = new JTextField();

public  JTextArea talkArea = new JTextArea();

public JScrollPane inputFieldScroll = new JScrollPane(inputField);

public JScrollPane talkAreaScroll = new JScrollPane(talkArea);
      talkArea.setEditable(false);

    talkArea.setBackground(Color.white);

     talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));     

     this.getContentPane().add(talkAreaScroll, null);

    //set input area

      inputField.setBackground(Color.white);

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

    inputFieldScroll.setVerticalScrollBar(new JScrollBar());

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

Pregunta:

¿Hay algún parámetro necesito fijar para que siga siendo una barra de desplazamiento vertical? ¿Por qué la barra de desplazamiento de entrada ocupa todo el InputField cuando los datos se convierte en una enorme línea? Aparece como una barra de desplazamiento vertical adecuada en el inicio.

Cualquier consejo apreciado.

Gracias

¿Fue útil?

Solución

A continuación se muestra un pequeño código compilables fragmento de código que he mencionado anteriormente. Estoy de acuerdo con camickr que no se debe utilizar el posicionamiento absoluto, sino más bien utilizar los controladores de distribución. Si es absolutamente necesario tener una barra de desplazamiento horizontal para el JTextField, a continuación, una manera de conseguir que funcione es tener siempre que se muestre, mediante el constructor JScrollPane que permite esto. es decir,

        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

Para por ejemplo.,

import java.awt.*;
import javax.swing.*;

public class FuSwing1b extends JPanel {
    private static final int TA_ROWS = 25;
    private static final int TA_COLS = 60;
    private JTextField inputField = new JTextField();
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS);

    public FuSwing1b() {
        talkArea.setEditable(false);
        talkArea.setFocusable(false);
        talkArea.setBackground(Color.white);
        //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT));

        JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        int gap = 10;
        setLayout(new BorderLayout(gap, gap));
        add(talkPane, BorderLayout.CENTER);
        add(inputPane, BorderLayout.SOUTH);
        setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap));
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("FuSwing1b");
        frame.getContentPane().add(new FuSwing1b());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

Otros consejos

no juegan con los límites. Utilice un controlador de distribución y que no tendrá que preocuparse por esto.

Cuando se crea el campo de texto usar algo como:

JTextField textField = new JTextField(10);

Esto creará un campo de texto que contendrá un mínimo de 10 caracteres. Si el número de caracteres supera el ancho de la pantalla del campo de texto el uso puede ver los caracteres restantes mediante el uso de las teclas de flecha derecha / izquierda. Esa es la interfaz de usuario normal utilizado por todas las aplicaciones que he visto. No trate de crear su propia interfaz de usuario mediante el uso de una barra de desplazamiento horizontal. Los usuarios no están acostumbrados a eso.

En el área de texto se puede crear usando:

JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane( textArea );

para crear un área de texto con 5 filas y aproximadamente 30 caracteres por línea.

Ahora agregue el campo de texto y el panel de desplazamiento a su marco "Gestores de diseño" y luego el paquete de marco. Los administradores de diseño determinarán el mejor tamaño para los compoents. Las barras de desplazamiento aparecerán automáticamente en el área de texto a medida que añada el texto a él y el texto es superior a 5 líneas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top