java - 从另一个类访问 GUI 组件

标签 java swing user-interface

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

最佳答案

首先尊重封装规则。使您的字段私有(private)。接下来,您希望为需要访问的字段设置 getter

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 类。使用构造函数注入(inject)(或“传递引用”)来传递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();
    }
}

关于java - 从另一个类访问 GUI 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22833328/

相关文章:

java - DateTimeFormatter 无法解析没有前导零的德语日期

java - System.out.print() 读取 Scanner 错误

java - 当元素具有空值时如何接受 xsd vs xml 验证

java - 我无法在 servlet-context XML 中使用 Spring 过滤器

java - 如何在 Java Swing 中的 System.exit() 之前显示通知 JDialog? (关闭)

java - 如何使用 Point 类设置点的位置?

java - 如果 JTable 已排序,TableModel RemoveRow() 会删除错误的行

java - Java动态生成按钮

android - 使用 LayoutInflater 在彼此下方多次添加相同的 View

html - 如何使用输入文本框内联按钮/下拉列表?