我有一个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。
对于我做错的任何想法,请?
答案 0 :(得分:2)
scrollPane = showPanel(selected);
选择项目时,请勿创建新的Scoll窗格。而是需要更改滚动窗格视口中包含的面板。也就是说,您的“showPanel”方法应该返回面板,而不是滚动窗格。然后你可以使用:
scrollPane.setViewportView( showPanel(selected) );
下次应发布适当的SSCCE。
答案 1 :(得分:1)
没有证据表明新创建的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));