JScrollBar Проблема вертикальной / горизонтальной настройки - Java Swing - PullRequest
4 голосов
/ 12 декабря 2010

Я просто пытаюсь добавить вертикальную полосу прокрутки к моим TextField и TextArea. Я использую ScrollPane, и он должен создать вертикальную / горизонтальную полосу прокрутки по умолчанию.

Проблема: Мне нужна вертикальная полоса прокрутки, чтобы увидеть данные, которые не видны. В начале появляется вертикальная полоса прокрутки, но при увеличении данных вертикальная полоса прокрутки превращается в горизонтальную полосу прокрутки. Также TextField исчезает, и на его месте появляется только горизонтальная полоса прокрутки. Я предполагаю, что это потому, что я установил границы, но я попытался изменить границы, и это в итоге полностью избавило меня от TextField.

Фрагмент моего кода:

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));

Вопрос:

Какой параметр мне нужно установить, чтобы он оставался вертикальной полосой прокрутки? Почему полоса прокрутки ввода занимает все поле ввода, когда данные становятся огромной линией? Это выглядит как правильная вертикальная полоса прокрутки в начале.

Любой совет приветствуется.

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

Ниже приведен небольшой фрагмент кода для компиляции, о котором я упоминал выше. Я согласен с Camickr, что вы не должны использовать абсолютное позиционирование, а использовать менеджеры по расположению. Если вам абсолютно необходимо иметь горизонтальную полосу прокрутки для JTextField, то один из способов заставить ее работать - всегда показывать ее, используя конструктор JScrollPane, который это позволяет. то есть,

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

Например,

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();
            }
        });
    }
}
1 голос
/ 12 декабря 2010

Не играй с границами. Используйте менеджер макетов, и вам не придется об этом беспокоиться.

При создании текстового поля используйте что-то вроде:

JTextField textField = new JTextField(10);

Это создаст текстовое поле, которое будет содержать не менее 10 символов. Если количество символов превышает ширину отображаемого текстового поля, использование позволяет увидеть оставшиеся символы с помощью клавиш со стрелками вправо / влево. Это обычный пользовательский интерфейс, используемый всеми приложениями, которые я когда-либо видел. Не пытайтесь создать свой собственный интерфейс с помощью горизонтальной полосы прокрутки. Пользователи к этому не привыкли.

для текстовой области вы можете создать его, используя:

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

для создания текстовой области с 5 строками и примерно 30 символами на строку.

Теперь добавьте текстовое поле и полосу прокрутки к фрейму «с помощью менеджеров компоновки», а затем упакуйте фрейм. Менеджеры по расположению определят лучший размер для компонентов. Полосы прокрутки автоматически появятся в текстовой области, когда вы добавите в нее текст, и текст будет превышать 5 строк.

...