1

我有几个类来创建一个非常简单的 GUI ( JFrame),其中包含一些对象,例如 JTabbedPanel 和JTree. 在 中创建功能区的类之一JTabbedPanel创建了JButton,它应该具有更新JTree.

我确实有一些 getter,但我不知道如何使用JButton更新在 main 方法中创建的对象(GUI 对象,我可以从那里到达JTree)。

如何更新在实际类的 main 方法中创建的对象上的某些内容JButton

我可能不得不改变我的项目结构。

public class Gui extends JFrame{
private Ribbon ribbon;
private Status status;
public Panel panel;

public Gui(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("INIT TITLE");
    setExtendedState(Frame.MAXIMIZED_BOTH);     
    setMinimumSize(new Dimension(600,400));
    setVisible(true);
    try {
          UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception e) {
          e.printStackTrace();
    }

    ribbon = new Ribbon();
    add(ribbon, BorderLayout.NORTH);        
    status = new Status();
    add(status, BorderLayout.SOUTH);
    panel = new Panel();
    add(panel, JSplitPane.HORIZONTAL_SPLIT);
    //panel.setLeftComponent(panel.getTree());
    //panel.openProject();
    setVisible(true);
    panel.loadProject();
}

功能区并没有做很多事情:

公共类功能区扩展 JTabbedPane {

public Ribbon(){

    addTab("Home", null, new RibbonHome());
    addTab("Import", null, new RibbonImport());
    addTab("Options", null, new RibbonOptions());
}

}

但是 Ribbon-Tab 创建了一些按钮:

public class RibbonHome extends JPanel{
private JButton b1, b2, b3;

public RibbonHome(){
    b1 = new JButton("test1");
    b2 = new JButton("test2");
    b3 = new JButton("test3");
    add(b1);
    add(b2);
    add(b3);

    b1.addActionListener(new ActionListener() {


        @Override
        public void actionPerformed(ActionEvent arg0) {
             //UPDATE the JTree 
        }
    });      

}

}
4

3 回答 3

1
  1. 按钮。addActionListener ( 主要 );
  2. main 实现ActionListener并提供方法actionPerformed()
于 2012-11-15T19:11:52.207 回答
0

最明显的答案当然是将你的类的引用传递Gui给你的Ribbon类,然后它又可以将它传递给RibbonHome类。

public Gui{
  //...
  ribbon = new Ribbon( this );
  //...
}

public Ribbon ( Gui gui ){
  //...
  addTab("Home", null, new RibbonHome( gui ));
  //...
}

public RibbonHome( Gui gui){
  //...
  b1.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
      //UPDATE the JTree 
    }
  }); 
  //...
}

但是,这确保了不同类之间非常紧密的耦合。我不知道你到底想更新什么,JTree但更基本的解决方案可能是在你的不同视图之间共享一个模型。当模型更改时,您JTree会自行更新,而按钮只会更新模型。

于 2012-11-17T10:59:46.747 回答
0

您正在做的事情的代码示例会使事情变得更容易,但无论如何。

可能您想要制作您计划更新类成员的组件。这样,您可以在它现在初始化的地方对其进行初始化,但仍然可以从您的 ActionListener 访问它。

同样,这只是对您如何构建事物的猜测,因此如果您可以发布代码示例,我相信您可以获得更详细的答案。

代码示例后编辑:

你可以给 RibbonHome 一个额外的 Gui 类型的私有成员。我通常称它为父母,所以它变成:private Gui parent;

在 RibbonHome 的构造函数中,添加 Gui 作为参数,这样,RibbonHome 将始终可以访问其父级。

还要将它添加到 Ribbon 的构造函数中,因为您需要将它传递到那里。

作为最后一步,您将始终必须以 Gui 作为参数来构造 Ribbon,因此在 Gui 中它将变为:ribbon = new Ribbon(this);

完成所有这些后,您就可以通过父级 JTree 的 getter 访问 JTree。

有更好的解决方案,因为这将有一个缺点,即您将永远无法从除 Gui 之外的其他组件构建新的 Ribbon,但如果您愿意,您可以使用接口。

于 2012-11-15T19:11:42.690 回答