Проблема вертикальной/горизонтальной настройки JScrollBar - Java Swing

Я просто пытаюсь добавить вертикальную полосу прокрутки в свои 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));

Вопрос:

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

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

Спасибо


person JJunior    schedule 12.12.2010    source источник
comment
Можете ли вы создать и опубликовать небольшой компилируемый и работающий пример? Кроме того, что произойдет, если вы установите предпочтительный размер JViewport JScrollPane, а не сам JScrollPane?   -  person Hovercraft Full Of Eels    schedule 12.12.2010


Ответы (2)


Ниже приведен небольшой компилируемый фрагмент кода, о котором я упоминал выше. Я согласен с 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();
            }
        });
    }
}
person Hovercraft Full Of Eels    schedule 12.12.2010
comment
Вы никогда не должны устанавливать предпочтительный размер текстовой области, если хотите, чтобы полосы прокрутки работали правильно. Полосы прокрутки появляются, когда предпочтительный размер текстовой области больше, чем размер области прокрутки. Если вы жестко запрограммируете предпочтительный размер текстовой области, то добавление текста не повлияет на его предпочтительный размер. - person camickr; 13.12.2010
comment
Спасибо за предложение и поправку! Вы конечно правы. Я отредактирую сообщение выше, чтобы отразить это. - person Hovercraft Full Of Eels; 13.12.2010
comment
Привет .. Я пробовал это: (inputField, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); настройка для моей панели прокрутки... но разницы не было. В итоге получил горизонтальную панель, когда данные превысили размер моего текстового поля. :( - person JJunior; 13.12.2010
comment
Опять же, если вы все еще застряли, создайте небольшую компилируемую программу, которую мы можем запускать, тестировать и модифицировать, как программу, которую я разместил выше. - person Hovercraft Full Of Eels; 13.12.2010

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

Когда вы создаете текстовое поле, используйте что-то вроде:

JTextField textField = new JTextField(10);

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

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

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

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

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

person camickr    schedule 12.12.2010