根据您的评论,您在那里有一些命名问题。你需要一个ActionListener
像这样实现 -interface 的类:class YourListenerClass implements ActionListener
,但你也可以通过一个匿名类来做到这一点,比如 new ActionListener { public void actionPerformed(ActionEvent e) { //your code for your button here } }); 当你设置你的ActionListener
.
关键是您需要以正确的方式命名您的方法。它必须是 public void actionPerformed(ActionEvent e)
并且你肯定必须实现ActionListener
-interface。接下来是您必须在按钮中注册您的侦听器,例如:
yourButton.addActionListener(new YourListenerClass);
或者像我之前向你展示的那样插入一个匿名类。
第二件事听起来像是我在评论中提到的多线程问题。我没有关注 scott 的链接,但根据他的描述,这可能是您想要阅读以解决任何进一步的阻塞问题的来源。
编辑:
嗯,起初我不想解释它,因为它是一大块代码,但由于问题仍然存在,我想SwingWorker
在我的答案中添加一些关于 s 的内容。
如果您有长时间运行的代码,则使用 a 将无济于事,Timer
因为它调用的代码也将在 EDT 上,因为它是由事件触发的。
取而代之的是,您可以使用 aSwingWorker
来解决此问题。不过,这需要一些额外的代码。这是您可以遵循的简单方法:
public class WorkingHard{
SwingWorker<String, String> worker;
JButton yourButton = ...;
...
//do some cool stuff, as register those listeners!
...
public void actionPerformed(ActionEvent evt){
if(evt.getSource().equals(yourButton);
// Construct a new SwingWorker
worker = new SwingWorker<String, Void>(){
@Override
protected String doInBackground(){
//do your reading in this method, it will be executed in an own thread
String readText = "i will be read".
/*your reading algorithm, you could also call publish(...) to post your results,
e.g. likewise), then you also have to override process(...). this process will be
thread save, too*/
readText += ... ;
...
return readText;
}
@Override
protected void done(){
try {
//do sth. with your result, now thread safe.
someGuiElement.setText(get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
// Execute the SwingWorker; the GUI will not freeze
worker.execute();
}
}
如果您想了解更多关于这些工人的信息......有几个线程处理它,例如这个。