Как добавить автоматическую полосу прокрутки c в jscrollpane? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь запрограммировать GUI вот так. Когда кнопка нажимается каждый раз, когда создается новая кнопка и помещается в указанную c позицию, но после добавления некоторых кнопок в jscrollpane полоса прокрутки не активируется, поэтому я не могу видеть все созданные кнопки.

Мой код здесь :

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test{

    private JFrame frame;
    private JPanel panel1,panel2;
    private JScrollPane pane;
    private JButton button;
    int i = 1, y = 10;

    public Test()
    {
        panel2 = new JPanel(null);
        panel2.setBounds(0,0,280,300);

        button = new JButton("Add Button");
        button.setBounds(90,10,120,30);

        pane = new JScrollPane();
        pane.setBounds(10,50,280,300);

        panel1 = new JPanel(null);
        panel1.setPreferredSize(new Dimension(300,400));
        panel1.setBackground(Color.WHITE);

        frame = new JFrame("Test");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel1);
        frame.pack();

        panel1.add(pane);
        panel1.add(button);

        pane.add(panel2);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panel2.add(new JButton("Button "+i)).setBounds(80,y,120,30);
                i += 1;
                y += 35;
            }
        });
    }
    public static void main(String[] args) {
        new Test();
    }
}

1 Ответ

1 голос
/ 20 июня 2020

Не используйте пустой макет. Не используйте setBounds ().

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

Это работа макета в:

  1. установить расположение компонента
  2. установить размер компонента
  3. вычислить предпочтительный размер панели.

Итак, решение состоит в том, чтобы использовать соответствующий менеджер компоновки на вашей панели.

Так, например, вы можете использовать BoxLayout:

//panel2 = new JPanel(null);
panel2 = new JPanel();
panel2.setLayout( new BoxLayout(panel2, BoxLayout.Y_AXIS) );

А затем, когда вы добавляете компоненты в видимый frame вам нужно revalidate () панель для вызова диспетчера компоновки:

//panel2.add(new JButton("Button "+i)).setBounds(80,y,120,30);
panel2.add(new JButton("Button "+i));
panel2.revalidate();

Нет необходимости в panel1. Просто добавьте компоненты во фрейм:

//panel1.add(pane);
//panel1.add(button);
frame.add(button, BorderLayout.PAGE_START);
frame.add(pane, BorderLayout.CENTER);

Но есть и другие проблемы:

pane = new JScrollPane();

Вам действительно нужно добавить панель в область прокрутки. Таким образом, код должен быть:

pane = new JScrollPane(panel2);

Поскольку у компонента может быть только один родительский элемент, вам необходимо удалить:

pane.add(panel2);

Поскольку панель2 была добавлена ​​в область прокрутки.

    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(panel1);
    frame.pack();

Приведенный выше лог c неверен.

Вы должны вызывать pack () и setVisible (true) только ПОСЛЕ того, как все компоненты были добавлены во фрейм.

Значит, большая часть опубликованного кода неверна.

Начните с прочтения раздела из краткого обзора Swing на Layout Managers . Загрузите рабочий демонстрационный код и узнайте, как лучше структурировать свой код. Измените код для вашего примера c.

...