gpt4 book ai didi

java - wait() 和 notification() 以及 ActionListener

转载 作者:行者123 更新时间:2023-12-01 22:06:48 25 4
gpt4 key购买 nike

我有一个与两个线程一起使用的图形界面,每个线程都必须在各自的文本区域中打印一个计数器。第二个线程(名为 threadEvent)与 ActionListener 和阻止和取消阻止线程的按钮一起使用。当用户按下按钮时,它会阻塞 threadEvent(它停止打印计数器),当再次按下按钮时,它会解除阻塞并继续在相应的文本区域中打印。为此,我必须使用 wait() 阻塞线程并使用 notification() 解除阻塞,我已经阅读了一些有关此的信息,但我不知道如何将它们与按钮一起使用

 class T implements Runnable{
private boolean print = true;
private int i = 0;
private long pause;
private JTextArea textArea;

T(long miliseconds,JTextArea textAreax){
pause = miliseconds;
textArea = textAreax;
}

public void pressedButton()
{
if(print)
print = false;
else
print = true;
}

public void run()
{
while(print)
{
try
{
this.printCounter();
Thread.sleep(pause);
this.i++;
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}

public void printCounter(){
String time;
time = Integer.toString(i);
textArea.setText(time);
}
}

class Interface extends JFrame implements ActionListener{
private JTextArea textArea,textArea2;
private JButton button;
private T thread,threadEvent;
private Thread t,tE;

Interface()
{
textArea = new JTextArea(10,7);
textArea2 = new JTextArea(10,7);
thread = new T(2000,textArea);
threadEvent = new T(1000,textArea2);
button = new JButton("Block/Unblock");
this.getContentPane().add(button,BorderLayout.SOUTH);
this.getContentPane().add(textArea,BorderLayout.WEST);
this.getContentPane().add(textArea2,BorderLayout.EAST);

t = new Thread(thread);
tE = new Thread(threadEvent);

t.start();
tE.start();

button.addActionListener(this);
}

public void actionPerformed(ActionEvent event)
{
threadEvent.pressedButton();
}
}

public class MessageThreads{

public static void main(String[] args) {
Interface i = new Interface();
i.setBounds(200, 200, 300, 240);
i.setVisible(true);
}

}

最佳答案

有关 Swing 和线程的注释:Swing is not thread-safe 。您只能从事件分派(dispatch)线程更新 Swing 组件(例如 textArea.setText(time);)。

您可以使用 SwingUtilities.invokeLater() 来执行此操作或SwingUtilities.invokeAndWait() 。例如:

SwingUtilities.invokeLater( new Runnable() {
@Override
public void run()
{ `textArea.setText(time); }
});

PS。我知道这更多的是评论而不是答案,但作为评论发布太多了

关于java - wait() 和 notification() 以及 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571244/

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