gpt4 book ai didi

java - 线程中断和ActionListener Java

转载 作者:搜寻专家 更新时间:2023-11-01 01:45:13 24 4
gpt4 key购买 nike

我有一个函数 graphics() 可以创建我的 JFrame 和两个 JRadioButton 并向它们添加 ActionListeners。此图形从 main() 调用,图形本身调用 game()。

public void game() throws Exception
{

jTextArea1.setLineWrap(true);
jTextArea1.setWrapStyleWord(true);
jTextArea1.setText("This is private information.");

jRadioButton1.setVisible(true);
jRadioButton2.setVisible(true);
try {
t.sleep(40000);
repaint();
} catch (InterruptedException e) {
// We've been interrupted: no more messages.
return;
}

显示“这是私有(private)信息”后。在文本区域中,我希望程序执行暂停 40 秒,或者直到用户按下 JRadioButton,以较早者为准。所以我添加了一个 ActionListener 并在其中调用了 t.interrupt() 。

private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
t.interrupt();
jRadioButton1.setVisible(false);
jRadioButton2.setVisible(false);
//System.out.println(t.interrupted());
jTextArea1.setText("Please wait...");

}

但是,即使在选择了应该触发中断的 JRadioButton 之后,也不会发生这种情况并且 t.interrupted 返回 false。

如有任何帮助,我们将不胜感激。

最佳答案

永远不要在 Swing 事件线程上调用 Thread.sleep(...),因为您将卡住线程并有效地卡住您的程序。解决方案是考虑使用 Swing Timer 来满足您的需求的时间相关部分,并使用 SelectionListener 来满足 JCheckBox 或 JRadioButton 需求。

例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class PausingExecution extends JPanel {
private static final String SELECTED_TEXT = "Snafus are Better!!!";
private static final String UNSELECTED_TEXT = "Fubars Rule!!";
private static final String TIMES_UP = "Time's Up!!!!";
private static final int TIMER_DELAY = 10 * 1000;

private JTextField messageField = new JTextField(UNSELECTED_TEXT, 10);
private JCheckBox checkBox = new JCheckBox("Click Me");

public PausingExecution() {
add(messageField);
add(checkBox);

checkBox.addItemListener(new ItemListener() {

@Override
public void itemStateChanged(ItemEvent iEvt) {
if (iEvt.getStateChange() == ItemEvent.SELECTED) {
messageField.setText(SELECTED_TEXT);
} else {
messageField.setText(UNSELECTED_TEXT);
}
}
});

Timer mySwingTimer = new Timer(TIMER_DELAY, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
messageField.setText(TIMES_UP);
checkBox.setEnabled(false);
}
});

mySwingTimer.setRepeats(false);
mySwingTimer.start();
}

private static void createAndShowGui() {
PausingExecution mainPanel = new PausingExecution();

JFrame frame = new JFrame("PausingExecution");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

关于java - 线程中断和ActionListener Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13061054/

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