-1

编辑:简化我的代码。

这是初始化 GUI 和服务器线程的主类。

public class Main {
    public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, UnknownHostException {
    Runnable tGUI = new TransceiverGUI();
    Runnable server = new Server(tGUI);
    new Thread(tGUI).start();
    new Thread(server).start();
    }
}

现在,在我的public class TransceiverGUI extends javax.swing.JFrame implements Runnable课堂上,我有一个方法如下:

protected boolean incomingFileRequest(String filename, long filesize, String user) throws InterruptedException, InvocationTargetException {
        /* .... code logic which executes .... */
        /* UPDATE GUI HERE DOES NOT WORK */
        LabelProgress.setForeground(Color.red);
        LabelProgress.setText("Receive Progress");
    }

每当incomingFileRequest从 GUI 类(从任何 EventListener)中调用它时,它都能正常工作并且 GUI 会更新。

但是,当我incomingFileRequestServer类/线程调用时,代码会运行并返回正确的值,但 GUI 不会更新。

服务器线程这样调用它: // POPUP with request boolean answer = gui.incomingFileRequest(message.getMessage(), message.getFileSize(), message.senderIPAddress);

我已将更新 GUI 的代码放在一个创建新线程的块中,如下所示:

Thread t = new Thread() {
public void run() {
   LabelProgress.setForeground(Color.red);
   LabelProgress.setText("Receive Progress");
   repaint();
}
};
t.start();

我也试过了javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { /* update GUI code */ } });

我的问题是,如何从另一个线程调用 GUI 类中的方法(更新 GUI)?请记住,代码是完美执行的,只是没有更新 GUI 元素。

任何帮助将不胜感激。

4

2 回答 2

2

从你的帖子

每当从 GUI 类(从任何 EventListener)中调用incomingFileRequest 时,它都能正常工作并且GUI 会更新。

但是,当我从服务器类/线程调用incomingFileRequest 时,代码运行并返回正确的值,但GUI 没有更新。

这正是一些人试图在评论中向你解释的内容。所有 GUI 更新必须在 GUI 线程 - EDT 中执行。

事件调度线程是处理你的“监听器”的线程,这就是 GUI 更新的原因。要从不同的线程更新您的 gui,您必须简单地“安排”要在 EDT 中执行的更改。为此,只需将您的 GUI 修改代码包装到Runnable类中并通过SwingUtilities.invokeLalater(Runnable)方法将其传递给 EDT。这样您的 GUI 将尽快更新

你也提到过

我还尝试了 javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { /* update GUI code */ } });。

结果如何?因为这正是它应该这样做的方式。如果这对您不起作用,那么您的代码还有其他一些问题,或者您的方法主体等待一些外部更新,或者它被安排在与您想象的不同的时刻。

于 2015-08-16T15:41:28.430 回答
0

最初我有

public class Main {

    public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, UnknownHostException {

    Runnable tGUI = new TransceiverGUI();
    Runnable server = new Server(tGUI);

    System.out.println("Starting GUI...");
    new Thread(tGUI).start();
    System.out.println("Starting Server...");
    new Thread(server).start();
    }
}

在寻找解决方案数小时后,我只是换了一种方式,我颠倒了将参数传递给线程的方式。正如您在以下(工作)代码中所见,我首先创建服务器线程,然后将其作为参数传递给 GUI 线程。我还更改了相应的构造函数以相应地接受参数。

更改后一切正常。我实际上没有理由为什么这个改变解决了我的问题。

public class Main {

        public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, UnknownHostException {

        Runnable server = new Server();
        Runnable tGUI = new TransceiverGUI(server);

        System.out.println("Starting Server...");
        new Thread(server).start();
        System.out.println("Starting GUI...");
        new Thread(tGUI).start();
        }
    }
于 2015-08-28T18:19:21.520 回答