2011-12-01 37 views
1

我有一个Swing中设计的图形用户界面,其中列出了所有组件。例如我有一个JComboBox与JList和JTextField,Java Swing - 如何更新GUI对象,即。来自同一包中子类的JTextField值

当我从JComboBox中选择不同的项目我试图使用ListSelectionListener调用子类中的方法更新基于选择的JTextField,

我该如何去正确地做到这一点?如何调用子类,然后从子类更新GUI对象的值?

回答

1
public class Parent { 

    private void init() { 
     // ... 
     combo.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Object selected = combo.getSelectedItem(); 
       textField.setText(getTextBasedOnSelection(selected)); 
      } 
     }); 
     // ... 
    } 

    /** 
    * Returns the text to display when the given object is selected. 
    * Subclasses may override this method to display what they want 
    */ 
    protected String getTextBasedOnSelection(Object selected) { 
     return selected.toString(); 
    } 
    // ... 
} 
1

我希望我的问题正确。你有一个包含多个子视图的视图组件,并且你想更新一个视图组件,因为在另一个子视图内完成了更改。

因此,你写一个动作监听你的组合框在主视图:

comboBox.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       textField.setText(comboBox.getSelectedItem()); 
      } 

     }); 
1

而是相互连接的部件直接,我建议应用Mediator pattern: 创建JPanel的一个子类(如XyzPane)你把所有的组件都放进去了。这个班级成为调解员。它

  • 监听及其组件的事件
  • 更新组件需要
  • 触发它自己的事件,如果需要的话(这使得它成为父母调解的一部分:在窗格,然后分组组件嵌套窗格)
+1

@trashgod:感谢您的链接。但是,也许我并不是指维基百科示例中所示的严格意义上的中介模式。而非Anthea或JB​​ Nizet所示的示例:组合框和textField不直接连接,只能通过父级注册的侦听器间接连接。 – Puce