从另一个类访问GUI组件

3

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

将所需的对象(可以是列表或其他形式)传递给需要访问它们的类(通过该类的构造函数),这种方式怎么样? - Stefan
5个回答

7

首先要遵守封装规则。将你的字段设为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类中可以执行某些操作,但只需要访问类中的某些内容即可执行该操作,则可以实现一个接口,其中包含需要执行某些操作的方法。像这样:

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

你成功地让我困惑了!我想要访问文本区域以添加其中的文本,就是这样。 - horHAY
Server 是在哪里创建的?是在 Server-Start 内部吗? - Paul Samsotha
服务器启动后是“是”。 - horHAY
好的。那么请修改Server的构造函数,使其与我的SomeListener构造函数相似,接受一个GUI参数。在实例化Server时,将GUI的实例传递给它。GUI gui = new GUI(); Server server = new Server(gui);。明白了吗? - Paul Samsotha
@peeskillet 非常感谢,运行良好。也感谢tony_craft、trashgod和stefan的帮助。 - horHAY
显示剩余4条评论

3

有几种方法可供选择:

  • 标识符gui是对您的GUI实例的引用。只要遵守事件分派线程,您就可以将gui传递给需要它的任何类。根据需要向GUI添加公共访问器方法。

  • 声明如JTextArea textAreaClients具有包私有访问性。它们可以在同一包中的其他类中引用。

  • 使用PropertyChangeListener安排文本区域从另一个类接收事件,如此处所示


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 组件的类,则该解决方案是可行的。 - Stefan
@Tony_craft 我该如何引用?当我尝试使用“gui.”访问GUI时仍然出现错误。 - horHAY
你能否发布一下你正在尝试访问“gui”的类或至少包含此部分的代码段。同时,请附上你遇到的错误信息。 - Tony_craft

1

我在这里提供一个简单的解决方案,希望它能够很好地工作。

表单A

控件

文本框: txtusername

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

表单B
访问表单A的控件
 public void ResetTextbox(JTextField jf)
 {
     jf.setText(null); // or you can set or get any text
 }

0

实际上没有必要使用实现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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接