java - 从其他方法访问 gui
问题描述
我想编写一个程序,当数据库中发生某些事情时自动调用管理员。要呼叫的号码应输入 a 中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() {
wait
当某些事情发生变化时使用和通知会更有效notify
,但我认为这可能会正常工作。
推荐阅读
- arrays - 使用 np.where 在 numpy 数组中查找唯一元组
- svn - SVN如何在一组多个更改中获取受影响文件的列表
- java - 在 spring boot 中无法连接到 mySql
- ssl - Nginx 多个域/服务器块 | SSL 奇怪的请求字符问题
- c# - 如何在不同的 Web 应用程序中使用一个 angularjs 应用程序?
- python - Gekko 中的模类型约束
- java - 如何以编程方式为选定的实体字段绑定休眠类型?
- r - 包安装问题前导错误: failed to lock directory
- python - 通过 Django QuerySet 注释反向相关对象
- python - 数据框索引上的 Pandas 交叉表