JPanel не обновляется при выборе с JComboBox - PullRequest
3 голосов
/ 08 июля 2011

Я пытаюсь написать довольно короткий класс, который «связывает» 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();        
}

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

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Когда вы добавляете currentDisplay в графический интерфейс, вы не добавляете переменную currentDisplay в графический интерфейс, а скорее объект , к которому относится переменная currentDisplay.Поэтому позже, когда вы измените компонент, на который ссылается переменная currentDisplay, будет иметь смысл, что это не будет иметь абсолютно никакого влияния на компонент, отображаемый в графическом интерфейсе, поскольку он все еще содержит исходный объект.

Я рекомендую aardvarkk дать вам прекрасную рекомендацию использовать CardLayout (от 1+ до aardvarkk).Если вы сделаете это, вы обнаружите, что это будет работать гладко (и тогда вы должны принять ответ Аардварка как ответ ).

4 голосов
/ 08 июля 2011

Вот (более или менее) мой код:

Что нам не помогает, потому что мы не знаем контекста того, как используется код.Для лучшей помощи отправьте SSCCE при задании вопроса.

currentDisplay = display;

Эта строка кода кажется неправильной.Все, что он делает, это изменяет значение переменной.Он не добавляет панель в графический интерфейс.Ваш основной код будет:

panel.remove( theOldPanel );
panel.add( theNewPanel );
panel.revalidate();
panel.repaint();

Однако это именно то, что CardLayout делает для вас, поэтому правильное решение состоит в том, чтобы следовать совету aardvarkk.

...