java - 从另一种方法访问 gui

标签 java class user-interface

我想编写一个程序,当数据库发生问题时自动调用管理员。要调用的号码应在 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() {

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

关于java - 从另一种方法访问 gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170719/

相关文章:

java - 使用 Eclipse 的 xml 智能感知?

java - 使用Gson将JSON反序列化为java记录

Java 并发实践 : Listing 3. 12 和 3.13

Python:找出 "Spouse"类?

java - 根据上一个面板中的用户输入显示可变 GUI 面板的建议

java - 四个不同的 wsdl2java 应用程序无法导入 wsdl,但 SoapUI 可以正常导入

css - 如何使用 AngularJS 动态创建 CSS 类

javascript - 对于 ES6 类,可以从静态方法返回该类的实例吗?

c# - 删除 ExpanderView 中的左边距/填充

java - 使合成在 SWT 中可聚焦