gpt4 book ai didi

java - 如何从 JButton ActionListener 调用重型算法

转载 作者:行者123 更新时间:2023-12-01 21:23:11 25 4
gpt4 key购买 nike

我正在编写一个既充当服务器又充当客户端的 Java 程序。忽略不相关的部分,它分为三个类:Main、Server 和 Client。 Main只是设置一个菜单并包含main方法。 Server和Client分别保存服务端和客户端的算法。

我想做的是根据按下的按钮从服务器和客户端类及其 GUI 调用算法。目前调用服务器的代码如下所示:

serverButton = new JButton();
serverButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
server.showGUI();
server.run();
}
});

问题是 server.run() 连续运行相当长的一段时间,并且工作量很大。这会导致 GUI 出现错误,根据我的理解,这是因为我从 EDT 调用该方法。

如何从主线程调用此方法?我是否需要创建一个 SwingWorker 并将其留在那里直到 server.run() 结束?

最佳答案

How can I call this method from the main thread?

这就是 Swing 中通常的做法。

public class WhatEverServer {

private UserInterface userInterface;
[...]

private static void createAndShowGUI() {

if( GraphicsEnvironment.isHeadless() )
logger.log( Level.FATAL, "This system seems to be 'headless'. Aborting now." );
else {
userInterface = UserInterface.getInstance();
userInterface.createAndShowUI();
}
}

public static void main( String[] args ) {

// schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater( new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}


public class UserInterface {

...
public void createAndShowUI() {

// make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );

// create and set up the window.
JFrame frame = new JFrame( "Whatever Server" );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// set UI components, i.e

// set main menu bar
frame.setJMenuBar( this.mainMenuBar );

// set layout
frame.getContentPane().setLayout( new BorderLayout() );

// add UI components

// display the window.
frame.pack();
frame.setVisible(true);
}
}

This bugs out the GUI, which from my understanding is because I'm calling the method from the EDT.

是的,由于操作是由事件触发的,因此 actionPerformed() 由 EDT(或在 EDT 上)调用。我不知道你在 server.run() 中做什么,但我想这不应该出现在 EDT 上。

Do I need to create a SwingWorker and leave it there until the end of server.run()?

在这种情况下我会使用 SwingWorker 或 SwingUtilities。您可以使用两个线程以这种方式编写 ActionHandler,一个用于执行一些“繁重的工作”,一个用于设置 UI:

public void actionPerformed(ActionEvent e) {

new Thread(new Runnable {
public void run() {
...
// do some 'heavy lifting' here ...

SwingUtilities.invokeLater(new Runnable() {
public void run() {
server.setupUI();
}
)
...
// or do some 'heavy lifting' here
});
}
}

关于java - 如何从 JButton ActionListener 调用重型算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38803998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com