gpt4 book ai didi

java - 将数组从 SwingWorker 线程返回到主线程

转载 作者:行者123 更新时间:2023-12-02 09:27:39 24 4
gpt4 key购买 nike

我有一个 Swing GUI,当它打开时,它会在后台执行一个线程。为此,我使用了 SwingWorker 线程。问题是我在主线程中声明了一个字符串数组,预计它会从 swing 工作线程收集信息并返回该信息,但在线程完成后,数组仍然为空。我猜想一旦线程完成,即使数组是在主线程中声明的,数组也会丢失其值。

如何将数组的值返回到主线程?

ArrayList<String> allnets = new ArrayList();
new SwingWorker<Object, Void>() {
@Override
public Object doInBackground() throws SocketException, UnknownHostException {
System.out.println("interfaces");
netAdapter = new NetInterface();
System.out.println(Thread.currentThread().getName());
for(int i = 0; i < allnets.length; i++) {
allnets.add("interface number");
}
return null;
}

@Override
public void done() {

}
}.execute();
System.out.println(Thread.currentThread().getName());
// String[] inetfaces = {"eth0", "eth1", "wlan1", "wlan2", "wlan3"};
JComboBox comboBox = new JComboBox(allnets);
comboBox.setToolTipText("Interfaces");
comboBox.setBounds(444, 51, 137, 22);
frame.getContentPane().add(comboBox);

最佳答案

要获取所有接口(interface)名称的列表,请调用java.net.NetworkInterface类的[静态]方法getNetworkInterfaces()。我假设您想从 SwingWorker 内部调用该方法。另外,根据您发布的代码,我假设您想要在 SwingWorker 类的 done() 方法中填充 JComboBox。由于所有工作都是在 SwingWorker 类中完成,因此方法 doInBackground() 不需要返回任何内容。

在使用 SwingWorker 时,我更喜欢创建一个完全独立的类来扩展 SwingWorker,而不是匿名内部类。

这是 Swing 应用程序的代码。 JFrame 显示一个 JLabel 和一个 JComboBoxJcomboBox 包含所有网络接口(interface)的名称列表。

请注意,在运行 JDK 13 的 Windows 10(64 位)计算机上,填充 JComboBox 几乎不需要任何时间,因此实际上并不需要 SwingWorker。我猜您只是想练习使用 SwingWorker,对吗?

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import javax.swing.WindowConstants;

public class SwngWrkr implements Runnable {
private JComboBox<Object> combo;
private JFrame frame;

public void run() {
showGui();
}

private JPanel createMainPanel() {
JPanel mainPanel = new JPanel();
mainPanel.add(new JLabel("Interfaces"));
DefaultComboBoxModel<Object> model = new DefaultComboBoxModel<Object>();
model.addElement("Loading...");
combo = new JComboBox<Object>(model);
mainPanel.add(combo);
return mainPanel;
}

private void showGui() {
frame = new JFrame("SW");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createMainPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
new GetIfTsk(combo).execute();
}

public static void main(String[] args) {
SwngWrkr instance = new SwngWrkr();
EventQueue.invokeLater(instance);
}
}

class GetIfTsk extends SwingWorker<Void, Void> {
private JComboBox<Object> combo;
private List<Object> netIfNames;

public GetIfTsk(JComboBox<Object> combo) {
this.combo = combo;
netIfNames = new ArrayList<>();
}

protected Void doInBackground() throws Exception {
Enumeration<NetworkInterface> ifs = NetworkInterface.getNetworkInterfaces();
int ndx = 0;
while (ifs.hasMoreElements()) {
NetworkInterface ni = ifs.nextElement();
String name = ni.getName();
System.out.printf("%2d. %s%n", ++ndx, name);
netIfNames.add(name);
}
return null;
}

protected void done() {
DefaultComboBoxModel<Object> model = (DefaultComboBoxModel<Object>) combo.getModel();
model.removeAllElements();
model.addAll(netIfNames);
model.setSelectedItem(netIfNames.get(0));
}
}

关于java - 将数组从 SwingWorker 线程返回到主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224488/

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