我想编写一个程序,当数据库发生问题时自动调用管理员。要调用的号码应在 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循环,里面有 sleep 定时器。每次重复都应该检查 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() {
使用 wait
和 notify
来通知某些内容发生变化会更有效,但我认为这可能可以正常工作。
关于java - 从另一种方法访问 gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170719/