我正在尝试编写一个非常简短的类,将JPanel“绑定”到JComboBox。我认为我有逻辑,但当我使用JComboBox选择新内容时没有任何反应...这里(或多或少)我的代码:
private DisplayPanel currentDisplay; //a displaypanel is simply an extended JPanel with an id field, and an overriden .equals() method
private JComboBox selector;
private List<DisplayPanel> displays;
public SelectionPanel(DisplayPanel panel){
displays = new ArrayList<DisplayPanel>();
selector = new JComboBox(new String[]{panel.id});
currentDisplay = panel;
selector.addActionListener(this);
this.add(selector);
this.add(currentDisplay);
this.displays.add(panel);
}
public void addNewSelection(DisplayPanel panel){
displays.add(panel);
selector.addItem(panel.id);
}
@Override
public void actionPerformed(ActionEvent e) {
JComboBox source = (JComboBox) e.getSource();
String id = (String) source.getSelectedItem();
for(DisplayPanel display: displays)
if(id.equals(display.id))
currentDisplay = display;
this.validate();
}
我假设我需要以某种方式覆盖repaint()函数,但我真的不确定最好的方法。
答案 0 :(得分:4)
这是(或多或少)我的代码:
这对我们没有帮助,因为我们不知道如何使用代码的上下文。为了更好的帮助,在提问时发布SSCCE。
currentDisplay = display;
这行代码似乎不正确。它所做的就是改变变量的值。它不会将面板添加到GUI。你的基本代码是:
panel.remove( theOldPanel );
panel.add( theNewPanel );
panel.revalidate();
panel.repaint();
然而,这正是CardLayout为您所做的,所以正确的解决方案是遵循aardvarkk的建议。
答案 1 :(得分:4)
当您将currentDisplay添加到GUI时,您不是将currentDisplay 变量添加到GUI,而是将currentDisplay变量引用的对象添加到GUI。因此,稍后当您更改currentDisplay变量引用的组件时,应该理解这对GUI显示的组件具有绝对无效,因为它仍然保留原始对象。
我认为aardvarkk的优秀推荐是你使用CardLayout(1+到aardvarkk)。如果你这样做,你会发现它会顺利运作(然后你应该接受Aardvarkk的回答