Jscrollbar Вертикальная / Горизонтальная настройка Проблема - Java Swing

StackOverflow https://stackoverflow.com/questions/4423504

Вопрос

Я просто пытаюсь добавить вертикальную полосу прокрутки до моего текстового поля и Textarea. Я использую Scrollpane, и он должен создать драйверов / горизонтальную полосу прокрутки по умолчанию.

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

Мой кодовый фрагмент:

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

Вопрос:

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

Любые совет оценили.

Спасибо

Это было полезно?

Решение

Ниже приведен небольшой коммутилизируемый фрагмент кода, который я упомянул выше. Я согласен с 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();
            }
        });
    }
}

Другие советы

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

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

JTextField textField = new JTextField(10);

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

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

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

Чтобы создать текстовую область с 5 строками и примерно 30 символов на строку.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top