2013-11-18 3 views
0

Я пытаюсь изменить компонент с JLabel на JComboBox, когда добавлена ​​еще одна опция, но по какой-то причине панель не обновляется.Явная смена существующего компонента

SSCCE:

public class SwitchComponent { 
    public static void main(String[] args) { 
     JPanel panel = new JPanel(); 
     JComponent component = new JLabel("This is a test"); 

     panel.add(component); 

     JComboBox<String> comboBox = new JComboBox<String>(); 
     comboBox.addItem("Testing.."); 
     comboBox.addItem("1.. 2.. 3.."); 

     component = comboBox; 

     // I have tried with only one of the below lines and without any also... 
     // Doesn't seem to have an effect. 
     // I've also tried invoking the below methods on the panel instead. 
     component.revalidate(); 
     component.repaint(); 

     JOptionPane.showConfirmDialog(null, panel, "Test", 
             JOptionPane.OK_OPTION, 
             JOptionPane.PLAIN_MESSAGE); 
    } 
} 

Почему это происходит? Не следует ли panel ссылаться на component так, чтобы любые изменения в component отражались через panel?

Должен ли я действительно полностью собирать панель при изменении компонента?

ответ

2

При нажатии кнопки ДА/НЕТ на JOptionPane закрывается JOptionPane.

Нам нужно снова добавить JComboBox в Panel и использовать JOptionPane, чтобы снова показать панель в вашем коде.

У попробовать с этим:

public class SwitchComponent { 
public static void main(String[] args) { 
    JPanel panel = new JPanel(); 
    JComponent component = new JLabel("This is a test"); 

    panel.add(component); 

    JOptionPane.showConfirmDialog(null, panel, "Test", 
            JOptionPane.OK_OPTION, 
            JOptionPane.PLAIN_MESSAGE); 

    panel.remove(component); 

    JComboBox<String> comboBox = new JComboBox<String>(); 
    comboBox.addItem("Testing.."); 
    comboBox.addItem("1.. 2.. 3.."); 
    panel.add(comboBox); 

    // I have tried with only one of the below lines and without any also... 
    // Doesn't seem to have an effect. 
    // I've also tried invoking the below methods on the panel instead. 
    panel.revalidate(); 
    panel.repaint(); 

    JOptionPane.showConfirmDialog(null, panel, "Test", 
      JOptionPane.OK_OPTION, 
      JOptionPane.PLAIN_MESSAGE); 

} 
} 
+0

Несмотря на то, что это работает, это вызывает проблемы с упорядочением компонентов, если на панели имеется более одного компонента. То есть метка может быть второй в серии из трех, я бы хотел, чтобы поле со списком оставалось вторым, когда компонент был изменен в поле со списком. Поэтому почему я пытался изменить ссылку. – Lerp

0

И.Э. метка может быть второй в серии из трех, я бы хотел, чтобы поле со списком оставалось вторым, когда компонент был изменен в поле со списком. Поэтому почему я пытался изменить ссылку

Использовать Card Layout. Он заменит компонент в том же месте.

Смежные вопросы