【问题标题】:Access GUI components from another class从另一个类访问 GUI 组件
【发布时间】:2014-04-03 09:27:28
【问题描述】:

我是 Java 新手,但遇到了难题。我想从另一个类访问 GUI 组件(已在一个类中创建)。我正在从一个类创建一个新的 GUI 类,就像这样;

GUI gui = new GUI();

我可以访问那个类中的组件,但是当我去另一个类时我不能。我真的只需要访问JTextAreas 来更新他们的内容。请有人指出我正确的方向,非常感谢任何帮助。

GUI类:

public class GUI {

    JFrame frame = new JFrame("Server");        
    ...
    JTextArea textAreaClients = new JTextArea(20, 1);  
    JTextArea textAreaEvents = new JTextArea(8, 1);

    public GUI()
    {
        frame.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 3));     
        ...
        frame.setVisible(true);
    }
}

【问题讨论】:

  • 如何将所需的对象(可能在列表或其他东西中)传递给需要访问它们的类(通过该类的构造函数)?

标签: java swing user-interface


【解决方案1】:

首先尊重封装规则。使您的字段private。接下来,您需要为需要访问的字段设置getters

public class GUI {
    private JTextField field = new JTextField();

    public GUI() {
        // pass this instance of GUI to other class
        SomeListener listener = new SomeListener(GUI.this);
    }

    public JTextField getTextField() {
        return field;
    }
}

然后您需要将您的 GUI 传递给需要访问文本字段的任何类。说一个ActionListener 类。使用构造函数注入(或“传递引用”)传递GUI 类。执行此操作时,SomeListener 中引用的 GUI 是同一个,并且您永远不会创建新的(不会引用您需要的相同实例)。

public class SomeListener implements ActionListener {
    private GUI gui;
    private JTextField field;

    public SomeListener(GUI gui) {
        this.gui = gui;
        this.field = gui.getTextField();
    }
}

虽然上述可能有效,但可能没有必要。首先考虑一下您想对文本字段做什么。如果某些操作可以在 GUI 类中执行,但您只需要访问类中的某些内容即可执行它,您可以使用需要执行某些操作的方法实现 interface。像这样的

public interface Performable {
    public void someMethod();
}

public class GUI implements Performable {
    private JTextField field = ..

    public GUI() {
        SomeListener listener = new SomeListener(GUI.this);
    }

    @Override
    public void someMethod() {
         field.setText("Hello");
    }
}

public class SomeListener implements ActionListener {
    private Performable perf;

    public SomeListener(Performable perf) {
        this.perf = perf;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        perf.someMethod();
    }
}

【讨论】:

  • 你成功迷惑了我!我想访问 textarea 以在里面附加文本,就是这样。
  • 嗯,你还没有准确指出你想从哪里访问它。于是我编了个案子。发生的事情是您将 GUI (GUI.this) 的当前实例传递给 other 类。就我而言,它是SomeListener。您可以使用我提供的 getter 方法访问文本字段。你可以看到SomeListener的构造函数,它接受GUI的一个实例,它不是创建一个新的,只是引用同一个GUI
  • 第二种情况只是另一种选择。如果您真的不需要访问该方法,而只需调用一个方法来操作文本字段。我试图让代码尽可能容易理解。
  • 我正在一个名为 Server-Start 的类中创建 GUI,我还想从一个名为 Server 的类中访问它。
  • Server 是在哪里创建的?里面Server-Start?
【解决方案2】:

有几种可能的方法:

  • 标识符gui 是对您的GUI 实例的引用。您可以将gui 传递给任何需要它的班级,只要您尊重event dispatch thread。根据需要将public 访问器方法添加到GUI

  • JTextArea textAreaClients 等声明具有 package-private 可访问性。它们可以被同一个包中的其他类引用。

  • 使用PropertyChangeListener 安排您的文本区域接收来自另一个类的事件,如here 所示。

【讨论】:

    【解决方案3】:

    访问该文本区域的最佳选择是为它们创建一个 get 方法。像这样的:

    public JTextArea getTextAreaClients(){
        return this.textAreaClients;
    }
    

    另一个也一样。所以要从另一个类访问它:

    GUI gui = new GUI();
    gui.getTextAreaClients();
    

    无论如何,您都需要在要使用它的任何类中引用 gui 对象,或者从创建它的类中引用对象。

    编辑 ---------------------------

    要将文本区域从 GUI 获取到服务器,您可以在 Create-Server 中执行类似的操作。

    GUI gui = new GUI();
    Server server = new Server();
    
    server.setTextAreaClients(gui.getTextAreaClients());
    

    为此,您应该在 Server 中包含一个 JTextArea 字段和如下所示的 setTextAreaClients 方法:

    JTextArea clients;
    
    public void setTextAreaClients(JTextArea clients){
        this.clients = clients;
    }
    

    因此,通过这种方式,您将从 gui 中获得对 JTextArea 的引用。

    【讨论】:

    • 这会创建一个GUI 的新实例,因此您将访问错误的实例。如果您要将GUI 的当前实例传递给需要访问GUI 组件的类,则该解决方案是可行的。
    • @Tony_craft 我将如何进行参考?当我尝试使用“gui”访问 gui 时,我仍然遇到错误。
    • 您能否发布您尝试访问“gui”的课程,或者至少发布您正在执行的部分。还包括您遇到的错误的帖子
    【解决方案4】:

    在这里我添加一个简单的解决方案,希望它运作良好,

    表格 A

    控件

    文本字段:txt用户名

        FormB fb = new FormB();
        fb.loginreset(txtusername); //only textfield name no other attributes
    

    表格 B
    访问 FormA 的控件

     public void ResetTextbox(JTextField jf)
     {
         jf.setText(null); // or you can set or get any text
     }
    

    【讨论】:

      【解决方案5】:

      其实不需要使用实现ActionListener的类。

      没有什么可能更容易实现:

      public class SomeActionListener {
      
      private Gui gui;
      private JButton button1;
      
          public SomeActionListener(Gui gui){
      
              this.gui  = gui;
              this.button1 = gui.getButton();
              this.button1.addActionListener(l -> System.out.println("one"));
          }
      
      }
      

      然后,就像其他人在我之前在这个主题中阐述的那样:

      public class GUI {
          private JButton button = new JButton();
      
          public GUI() {
              // pass this instance of GUI to other class
              SomeActionListener listener = new SomeActionListener(GUI.this);
          }
      
          public JButton getButton() {
              return button;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-15
        • 1970-01-01
        • 2012-09-02
        • 2012-09-07
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        相关资源
        最近更新 更多