gpt4 book ai didi

Java HashMap.put() 无法在 invokeLater createAndShowGui 方法内工作

转载 作者:行者123 更新时间:2023-11-30 04:00:44 26 4
gpt4 key购买 nike

我有一个类,它读取从服务器发送的消息,并且该消息可以包含一个从消息内的数据创建 gui 的命令,即该消息可以是一个对象 {"show", data, guiData}。

该类有一个私有(private) HashMap,新的 GUI 在 createAndShowGui 方法中添加到该 HashMap 中。但是当我从上述方法内部调用 .put() 时,它不起作用,因为在调用 createAndShowGui 方法后调用时,我 HashMap.get() 返回 null 。

我尝试将 HashMap 的修饰符更改为final,但似乎不起作用。

代码:

public class GuiController implements Runnable{

private final HashMap<String, JFrame> frameHashMap; //hashmap that contains the JFrame's

public GuiController(LinkedBlockingQueue<Object> inq, LinkedBlockingQueue<String> outq) {
//constructor, loads blocking queue that messages are read off
}

@Override
public void run() {
//recieves data from server, calls recieveMessage() with data object
}

private void receiveMessage(Object input) {
if (c.qn(input)) return; //server api function to test if object is null
final Object msg = input;
final String message = (String)c.at(msg,0);
final String name = (String)c.at(msg,1);
final Object data;
System.out.println(message + " " +name);

switch (message){
case "show":
data = c.at(msg,2);
if (!frameHashMap.containsKey(name)){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGui(name, data, c.at(msg, 3), String.valueOf((char[])c.at(msg, 4)));
}
});
}

for (String x: frameHashMap.keySet()) System.out.println(x + " -> " + frameHashMap.get(x));


break;
//other cases
}
}


private void createAndShowGui(String name, Object data, Object gData, String title){
System.out.println("Creating GUI with data at " + name + ", title: " + title + "...");

JFrame temp = new JFrame();

temp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
temp.setLocationRelativeTo(null);
temp.setTitle(title);
temp.setContentPane(new KPanel(data, gData, outqueue)); //Subclass of JPanel for handling gui data
temp.setName(name);

this.frameHashMap.put(name, temp); //this doesn't work

}

}

代码在createAndShowGui方法中打印出了println,但是switch语句中的for循环没有打印出任何内容,并且运行.get(name)返回null。

编辑:抱歉,我没有更多细节,此类仅在主方法的单个新线程中启动。该代码打印出输入数据的名称以及 KPanel 构造函数中的任何 println,据我所知,唯一不起作用的是 .put() 语句。我将进行推送,以便您可以从 github 下载源代码。请注意,这是一个私有(private)项目,我还没有真正抽出时间来正确地评论它。

它位于 https://github.com/adnang/JavaKGE 的 fs_createandshow 分支中

最佳答案

如果您使用

SwingUtilities.invokeAndWait(Runnable doRun)

而不是

SwingUtilities.invokeLater(Runnable doRun)

您的踩踏问题应该得到解决。 invokeAndWait 会将线程放在 EDT 上,但也会等到 EDT 处理完毕后再继续调用它。这样您就可以保证 put(...)get(...)

之前执行

关于Java HashMap.put() 无法在 invokeLater createAndShowGui 方法内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049581/

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