gpt4 book ai didi

java - DefaultListModel 是否会覆盖我的 Action 监听器中的 Action 顺序?

转载 作者:行者123 更新时间:2023-11-30 02:54:05 24 4
gpt4 key购买 nike

我的 JAVA 程序中有一个部分,您单击一个按钮,actionListener 应该经历以下过程;

  1. 将按钮上的文字从“开始”更改为“待机”
  2. 向面板添加标签,表明进程已启动
  3. 执行一个方法(对数据进行排序并通过 addelement 将其返回到 defaultListModel JList,最后
  4. 将按钮上的文本从“开始”更改为“完成”

如下

uploadNotamButton.addActionListener((ActionEvent e) -> {
if(e.getSource()==uploadNotamButton)
uploadNotamButton.setText("STANDBY");
progressLabel.setText("Process Has Begun, standby...");
progressLabel.setVisible(true);

uploadNotams();

uploadNotamButton.setText("COMPLETE");
});

但是,当我按下按钮时,按钮文本不会改变,标签不会显示,但方法会执行。仅当该方法完成时,按钮文本才会更改为“完成”(从不显示“待机”),并且显示“该过程已开始,待机”的标签(当该过程完成时)。

这是defaultlistmodel的一个优先于一切的功能还是我的编码经验不足?

此外,在该方法中分析的数据会一次性显示在 JList 中,而不是一次显示每个元素。如果数据在分析时显示在列表中,那么至少会表明正在发生某些事情。这对于 defaultListModel 来说是不可能的吗?

提前非常感谢
PG

最佳答案

Is this a feature of defaultlistmodel that takes priority over everything or my coding inexperience?

这与 DefaultListModel 无关,而与 Swing 是单线程有关。您的长时间运行的进程正在 Swing 事件线程上运行,阻止该线程执行其必要的操作,包括在 GUI 上绘制文本和图像以及与用户交互。

解决方案是使用后台线程(例如可以通过 SwingWorker 获取),在此后台​​线程中运行长时间运行的代码,向工作线程添加一个 PropertyChangeListener 以在完成时收到通知,然后响应此通知.

例如(代码未测试)

uploadNotamButton.addActionListener((ActionEvent e) -> {
// if(e.getSource()==uploadNotamButton)
uploadNotamButton.setText("STANDBY");
progressLabel.setText("Process Has Begun, standby...");
progressLabel.setVisible(true);

// create worker to do background work
SwingWorker<Void, Void> worker = new SwingWorker<>() {
@Override
protected Void doInBackground() throws Exception {
// this is all done within a background thread
uploadNotams(); // don't make any Swing calls from within this method
return null;
}
};

// get notified when the worker is done, and respond to it
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getNewValue == SwingWorker.StateValue.DONE) {
uploadNotamButton.setText("COMPLETE");

// the code below needs to be surrounded by a try/catch block
// and you'll need to handle any exceptions that might be caught
((SwingWorker) evt.getSource()).get();
}
}
});
worker.execute(); // run the worker
});

关于java - DefaultListModel 是否会覆盖我的 Action 监听器中的 Action 顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37773432/

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