从另一个类访问GUI组件

时间:2014-04-03 09:27:28

标签: 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);
    }
}

5 个答案:

答案 0 :(得分:6)

首先尊重封装规则。制作字段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类。执行此操作时,GUI中引用的SomeListener是相同的,并且您永远不会创建新的public class SomeListener implements ActionListener { private GUI gui; private JTextField field; public SomeListener(GUI gui) { this.gui = gui; this.field = gui.getTextField(); } } (它不会引用您需要的相同实例)。

interface

虽然上述可能有效,但可能是不必要的。首先考虑一下你想要对文本字段做什么。如果某些操作可以在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(); } } 。像这样的东西

{{1}}

答案 1 :(得分:3)

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

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

对于另一个人也一样。所以从另一个班级访问它:

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

无论如何,你需要在你想要使用它的任何类中引用gui对象,或者在你创建它的类中引用一个对象。

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

要从GUI到Server获取文本区域,您可以在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的引用。

答案 2 :(得分:3)

有几种方法可以:

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

  • JTextArea textAreaClients等声明具有package-private辅助功能。它们可以在同一个包中的其他类中引用。

  • 安排您的文字区域使用PropertyChangeListener从其他班级接收活动,如here所示。

答案 3 :(得分:1)

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

表格A

控件

Textfield:txtusername

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

表格B
访问FormA&#39的控制权

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

答案 4 :(得分: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;
    }
}