首页 > 解决方案 > 从其他方法访问 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或访问变量?adminTelNumberdoSomething

顺便说一句......真实的doSomething有一个无限的while循环,里面有睡眠定时器。每次重复它都应该检查是否adminTelNumber改变了。所以它应该调用实际号码。

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

谢谢!

标签: javaclassuser-interface

解决方案


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

首先,完全从另一个线程访问 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,但我认为这可能会正常工作。


推荐阅读