使用JComboBox选择时,JPanel不会刷新

时间:2011-07-07 20:56:52

标签: java swing jpanel jcombobox

我正在尝试编写一个非常简短的类,将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()函数,但我真的不确定最好的方法。

2 个答案:

答案 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的回答 答案)。

相关问题