Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将函数分配给Jbutton_Java_Swing_Jbutton_Actionlistener_Jtree - Fatal编程技术网

Java 将函数分配给Jbutton

Java 将函数分配给Jbutton,java,swing,jbutton,actionlistener,jtree,Java,Swing,Jbutton,Actionlistener,Jtree,我有几个类来创建一个非常简单的GUI(JFrame),其中包含一些对象,如JTabbedPanel和JTree。在JTabbedPanel中创建功能区的一个类创建了一个JButton,该类应该具有更新JTree的功能 我确实有一些getter,但我不知道如何使用JButton更新在main方法中创建的对象(GUI对象,从那里我可以访问JTree) 如何在JButton的实际类中的main方法中创建的对象上更新某些内容 我可能不得不改变我项目的结构 public class Gui extends

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

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

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

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

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());
}
}

但功能区选项卡会创建一些按钮:

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 
        }
    });      

}

}

您正在做的代码示例将使事情变得更简单,但无论如何

您可能希望使计划更新的组件成为类成员。这样,您可以在现在初始化的地方初始化它,但仍然可以从ActionListener访问它

同样,这是一个关于你是如何构造事物的猜测,所以如果你能发布一个代码示例,我相信你能得到更详细的答案

代码示例后编辑:

您可以为RibbonHome提供Gui类型的额外私有成员。我通常称之为父级,因此它变成:
privategui父级

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

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

作为最后一步,您将始终必须使用Gui作为参数来构造Ribbon,因此在Gui中它将变成:
Ribbon=newRibbon(this)

一旦你完成了所有这些,你就可以通过你的JTree在parent上的getter到达JTree


有更好的解决方案,因为这将有一个缺点,即您永远无法从Gui以外的其他组件构建新功能区,但如果您需要,可以使用接口

您正在做的代码示例将使事情变得更简单,但无论如何

您可能希望使计划更新的组件成为类成员。这样,您可以在现在初始化的地方初始化它,但仍然可以从ActionListener访问它

同样,这是一个关于你是如何构造事物的猜测,所以如果你能发布一个代码示例,我相信你能得到更详细的答案

代码示例后编辑:

您可以为RibbonHome提供Gui类型的额外私有成员。我通常称之为父级,因此它变成:
privategui父级

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

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

作为最后一步,您将始终必须使用Gui作为参数来构造Ribbon,因此在Gui中它将变成:
Ribbon=newRibbon(this)

一旦你完成了所有这些,你就可以通过你的JTree在parent上的getter到达JTree

有更好的解决方案,因为这将有一个缺点,即您永远无法从Gui以外的其他组件构建新功能区,但如果您需要,可以使用接口

  • 按钮(主)
  • main实现并提供了该方法
  • 按钮(主)
  • main实现并提供了该方法

  • 最明显的答案当然是将
    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
    会自动更新,而按钮只会更新模型。

    最明显的答案当然是将
    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
    会自动更新,而按钮只会更新模型。

    Good point;)问题是:如何更新在JButton实际类的main方法中创建的对象上的内容?好问题。我已将其编辑到帖子中。好观点;)问题是:如何更新在JButton实际类的main方法中创建的对象上的内容?好问题。我已将其编辑到帖子中。非常感谢,我将在今天晚些时候尝试。非常感谢,我将在今天晚些时候尝试。有什么更好的解决方案?我对Java相当陌生,我想知道,什么是最佳实践。什么是更好的解决方案?我对Java相当陌生,我想知道,最佳实践是什么。