从其他方法访问 GUI



我想编写一个程序,当数据库中发生某些事情时自动调用管理员。要呼叫的号码应在TextField中输入,按下按钮后应将其写入变量中。

所以我的 gui 类看起来像这样:

package ui_test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class UI implements ActionListener{
JFrame frame;
JPanel panel;
JButton button;
JTextField textField;
JTextField textFieldInfo;
private String adminTelNumber = "";
public UI() {
frame = new JFrame("Caller GUI");
panel = new JPanel();
textField = new JTextField();
textFieldInfo = new JTextField();
textField.setText("Nummer eingeben!");
textFieldInfo.setText("Hier kommt die Info!");
button = new JButton("Übernehmen");
button.addActionListener(this);
panel.add(textField);
panel.add(button);
panel.add(textFieldInfo);
frame.add(panel);
frame.pack();
frame.setVisible(true); 
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button){
adminTelNumber = textField.getText();
textFieldInfo.setText(this.getAdminTelNumber().toString().trim());
}   
}
public String getAdminTelNumber() {
return adminTelNumber;
}
}

我的测试类如下所示:

package ui_test;
import java.awt.EventQueue;
public class UiTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UI ui = new UI();
} catch (Exception e) {
e.printStackTrace();
}
}
});
doSomething();
}
public static void doSomething() {
String telNumber = ui.getAdminTelNumber();
}
}

如何调用getAdminTelNumber或访问adminTelNumber变量,就像我在doSomething中想要的那样?

顺便一提。。。真正的doSomething有一个无休止的while循环,里面有睡眠计时器。每次重复它都应该检查adminTelNumber是否被更改。所以它应该调用实际号码。

希望你能帮助我...我很菜鸟:D

谢谢!

这里有两个问题需要解决:

首先,从另一个线程访问 UI。这是容易的部分。

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
final UI ui = new UI();
new Thread() {
public void run() {
doSomething(ui);
}
}.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void doSomething(UI ui) {

其次,以线程安全的方式从另一个线程访问 UI - 最简单的方法是使读取和写入同步:

public synchronized void actionPerformed(ActionEvent e) {

public synchronized String getAdminTelNumber() {

当某些内容发生变化时,使用waitnotify来通知会更有效,但我认为这可能工作正常。

最新更新