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