JScrollPane для панели, содержащей набор меток с BoxLayout - PullRequest
2 голосов
/ 21 февраля 2010

Я бы хотел использовать JScrollPane для панели, в которой есть произвольный список меток, используя макет блока. Я пытаюсь сделать так, чтобы полоса прокрутки появлялась, если бы было слишком много элементов (меток) для отображения.

Я попытался добавить JScrollPane на панель, а затем добавить метки, но тогда я не вижу полосу прокрутки.

Есть идеи?

ТИА

Ответы [ 4 ]

1 голос
/ 21 февраля 2010

Обязательно наберите validate() или revalidate() на JScrollPane после добавления элемента, чтобы принудительно пересчитать предпочтительный размер панели.

1 голос
/ 21 февраля 2010

Для такого рода вещей вы обычно используете JList или JTable (если вам нужен пользовательский рендеринг).

0 голосов
/ 27 декабря 2011

Вы не забыли установить предпочтительный размер панели содержимого?

    final JFrame frame = new JFrame("Scroll Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    final Box textArea = Box.createVerticalBox();
    final JScrollPane textAreaScroll = new JScrollPane(textArea);
    textAreaScroll.setPreferredSize(new Dimension(80,150)); /* essential! */
    JButton addButton = new JButton("ADD");
    addButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            textArea.add(new JLabel("abc"));
            textArea.revalidate();
        }
    });

    frame.getContentPane().add(textAreaScroll, BorderLayout.SOUTH);
    frame.getContentPane().add(Box.createRigidArea(new Dimension(10,10)), BorderLayout.CENTER);
    frame.getContentPane().add(addButton, BorderLayout.NORTH);

    frame.pack();
    frame.setVisible(true);

В этом примере полоса прокрутки работает правильно, но если вы удалите строку, помеченную как «существенную», она больше не будет работать.

0 голосов
/ 22 февраля 2010

Вот как я это сделал.

JPanel midPanel = new JPanel();
midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS));
midPanel.add(new JLabel("<html><u>Label</u>"));
Box box = Box.createVerticalBox();
for (Item item : data.getInventory()) {
    inventory.add(box.add(new JLabel(item.getName())));
}

JScrollPane jscrlpBox = new JScrollPane(box);
midPanel.add(jscrlpBox);
add(midPanel, BorderLayout.CENTER);

От:

http://www.java2s.com/Code/Java/Swing-JFC/JScrollPanetoholdscrollablecomponent.htm

...