从JComboBox中选择元素后如何刷新JScrollPane?

时间:2011-03-13 12:16:43

标签: java swing jcombobox

我有一个JComboBox,每当我从JComboBox中选择一个不同的元素时,我想在JScrollPane中加载一个不同的内容。内容由不同数量的JLabel和JTextField组成。

我做了什么:

JScrollPane scrollPane;
JComboBox combo;

JPanel back = new JPanel(new BorderLayout());
combo = new JComboBox({ "Bird", "Cat", "Dog", "Rabbit", "Pig" });
combo.addActionListener(new AnimalLoader());
scrollPane = showPanel((String) combo.getSelectedItem());

back.add(combo, BorderLayout.NORTH);
back.add(scrollPane, BorderLayout.SOUTH);

back.setVisible(true);

protected JScrollPane showPanel(String name)
{
     JPanel contentPanel = new JPanel(new JLabel(name));
     scrollPane = new JScrollPane(contentPanel);

     return scrollPane;
}

private class AnimalLoader implements ActionListener
{
     public void actionPerformed(ActionEvent e)
     {
            JComboBox cb = (JComboBox) e.getSource();
            String selected = (String) cb.getSelectedItem();
            scrollPane = showPanel(selected);              
     }
}

当我选择另一个项目时,我没有设法重新加载不同的JScrollPane。 只加载了属于JComboBox的第一个项目(默认项目)的JScrollPane。

对于我做错的任何想法,请?

4 个答案:

答案 0 :(得分:2)

scrollPane = showPanel(selected);     

选择项目时,请勿创建新的Scoll窗格。而是需要更改滚动窗格视口中包含的面板。也就是说,您的“showPanel”方法应该返回面板,而不是滚动窗格。然后你可以使用:

scrollPane.setViewportView( showPanel(selected) );

下次应发布适当的SSCCE。

答案 1 :(得分:1)

没有证据表明新创建的JScrollPane曾被添加到任何内容中。

我会尝试以下任何一种:

  1. 添加带有CardLayout的JPanel JScrollPane,并添加其他 集合的组件 JPanel的。
  2. 呼叫 setViewportView(组件视图)上 现有的JScrollPane。

答案 2 :(得分:0)

panel.revalidate();
panel.repaint();

答案 3 :(得分:0)

当您使用此example时,请尝试第73行附近ComboBoxDemo构造函数末尾的此变体:

//Lay out the demo.
add(petList, BorderLayout.PAGE_START);
JScrollPane jsp = new JScrollPane(picture);
jsp.getViewport().setPreferredSize(new Dimension(100, 100));
add(jsp, BorderLayout.PAGE_END);
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));