gpt4 book ai didi

Java JFrame : Update GUI during an event (not within a timer)

转载 作者:行者123 更新时间:2023-12-02 04:36:34 24 4
gpt4 key购买 nike

已经尝试了一段时间,进展缓慢。我在 JFrame 中有一些元素,当我单击播放按钮(触发 ActionEvent)时,我想更新/切换其可行性。但是,这些似乎仅在actionPerformed 方法完成后才会更新。这就是我认为正在发生的事情,因为我的 SoundPlayer 对象的构造函数触发了 (Thread.sleep),导致明显的延迟。我确实读过here使用 Thread.sleep() 会锁定 GUI,但我在调用 SoundPlayer 之前进行了更改,所以我认为这不是问题。

如下所示,我尝试重新绘制 JFrame 以及单个元素。尽管我的 println 语句打印了正确的时间,但这些直到 SoundPlayer 的延迟完成后才会更新。

我曾想过将多线程作为一种解决方案,但我不明白为什么需要这样做。感谢任何有关此事的帮助!

public void actionPerformed(ActionEvent e){

int channel = 0, volume = 0; //Assigned for safety.
String musicNotes = ""; //Will be filled with the under-input.
boolean willPlay = true; //Assumes will be played.

/*Stuff that makes 'willPlay' either true of false*/

//If nothing is wrong, plays the String!
if (willPlay) { //If above parameters are good...
badNums.setVisible(false);
prog.setVisible(true);

if (vis.isSelected())
prog.setText("Estimated duration: " + estiDuration(musicNotes)*(0.4) + "seconds");
else
prog.setText("Duration: " + estiDuration(musicNotes)*(0.3) + "seconds");

System.out.println("test");
repaint();
prog.repaint();

new SoundPlayer(channel, volume, musicNotes); //Plays the music!
} else {
vis.setVisible(false);
badNums.setVisible(true);
}
}

最佳答案

Swing 是单线程的 - 所有用于绘画、事件等的代码...都在此线程(称为 EDT)上运行。如果您有一个长时间运行的任务并将其放在 EDT 上,则在完成之前它不会执行任何其他操作(请注意,调用 repaint 不会直接 ​​repaintComponent ,因此在此调用之后运行一些长时间的任务并不意味着Component实际上会在之前绘制自己)。如果您需要执行冗长的操作,请在不同的 Thread 中执行此操作- 这可以直接使用 Thread 来完成,或使用 SwingWorker 。如果是前者,请确保使用 SwingUtilities.invokeXXX 将任何对 Swing 的调用分派(dispatch)到 EDT。

关于Java JFrame : Update GUI during an event (not within a timer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30675029/

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