我要做什么?
单击时Start JButton
,SwingWorker
将执行。在doInBackground()
方法内部,我将方法的每个索引传递arrNames
给publish()
方法,以便可以在中显示它JTextArea
。
发生了什么 ?
如果我 不 守行System.out.format("Counter : %d%n", counter);
作为 注释
,在我doInBackground()
的方法SwingWorker
,则SwingWorker
是 按预期工作 。尽管如果我将
其注释掉 ,则SwingWorker
停止响应 。
难道我做错了什么 ?
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b16)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing)
这是我正在使用的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingWorkerExample1
{
private JLabel statusLabel;
private JTextArea tArea;
private JButton startButton;
private JButton stopButton;
private BackgroundTask backgroundTask;
private ActionListener buttonActions =
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
JButton source = (JButton) ae.getSource();
if (source == startButton)
{
startButton.setEnabled(false);
stopButton.setEnabled(true);
backgroundTask = new BackgroundTask();
backgroundTask.execute();
}
else if (source == stopButton)
{
backgroundTask.cancel(true);
stopButton.setEnabled(false);
startButton.setEnabled(true);
}
}
};
private void displayGUI()
{
JFrame frame = new JFrame("Swing Worker Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(5, 5));
statusLabel = new JLabel("Status Bar", JLabel.CENTER);
tArea = new JTextArea(20, 20);
tArea.setWrapStyleWord(true);
tArea.setLineWrap(true);
JScrollPane textScroller = new JScrollPane();
textScroller.setBorder(
BorderFactory.createTitledBorder("Textual OUTPUT : "));
textScroller.setViewportView(tArea);
startButton = new JButton("Start");
startButton.addActionListener(buttonActions);
stopButton = new JButton("Stop");
stopButton.setEnabled(false);
stopButton.addActionListener(buttonActions);
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(stopButton);
contentPane.add(statusLabel, BorderLayout.PAGE_START);
contentPane.add(textScroller, BorderLayout.CENTER);
contentPane.add(buttonPanel, BorderLayout.PAGE_END);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private class BackgroundTask extends SwingWorker<Void, String>
{
private int counter = 0;
private String[] arrNames = { "US Rates Strategy Cash",
"Pavan Wadhwa(1-212) 844-4597", "Srini Ramaswamy(1-212) 844-4983",
"Meera Chandan(1-212) 855-4555", "Kimberly Harano(1-212) 823-4996",
"Feng Deng(1-212) 855-2555", "US Rates Strategy Derivatives",
"Srini Ramaswamy(1-212) 811-4999",
"Alberto Iglesias(1-212) 898-5442",
"Praveen Korapaty(1-212) 812-3444", "Feng Deng(1-212) 812-2456",
"US Rates Strategy Derivatives", "Srini Ramaswamy(1-212) 822-4999",
"Alberto Iglesias(1-212) 822-5098",
"Praveen Korapaty(1-212) 812-3655", "Feng Deng(1-212) 899-2222" };
public BackgroundTask()
{
statusLabel.setText((this.getState()).toString());
System.out.println(this.getState());
}
@Override
protected Void doInBackground()
{
statusLabel.setText((this.getState()).toString());
System.out.println(this.getState());
while (!isCancelled())
{
counter %= arrNames.length;
//System.out.format("Counter : %d%n", counter);
publish(arrNames[counter]);
counter++;
}
statusLabel.setText((this.getState()).toString());
System.out.println(this.getState());
return null;
}
@Override
protected void process(java.util.List<String> messages)
{
for (String message : messages)
tArea.append(String.format(message + "%n"));
}
}
public static void main(String[] args)
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
new SwingWorkerExample1().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
*编辑1:*
按照建议,如果我添加Thread.sleep(...)
,它确实可以工作,但是会抛出InterruptedException
如下所示的错误。这样就可以了。但这是
合法 的表演方式吗?
C:\Mine\JAVA\J2SE\classes>java SwingWorkerExample1
PENDING
STARTED
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:108)
at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:76)
at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at javax.swing.SwingWorker.run(SwingWorker.java:335)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
DONE
只有doInBackground()
被更改,从而引发了上述异常:
@Override
protected Void doInBackground()
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
statusLabel.setText((BackgroundTask.this.getState()).toString());
}
};
EventQueue.invokeLater(runnable);
System.out.println(this.getState());
while (!isCancelled())
{
counter %= arrNames.length;
//System.out.format("Counter : %d%n", counter);
publish(arrNames[counter]);
try
{Thread.sleep(30);}
catch(InterruptedException ie)
{ie.printStackTrace();}
counter++;
}
runnable = new Runnable()
{
@Override
public void run()
{
statusLabel.setText((BackgroundTask.this.getState()).toString());
}
};
EventQueue.invokeLater(runnable);
System.out.println(this.getState());
return null;
}
如果我添加Thread.sleep(…),它确实可以工作,但是会抛出InterruptedException
显然产生异常的代码(从OP的编辑中复制):
while (!isCancelled()) {
counter %= arrNames.length;
// System.out.format("Counter : %d%n", counter);
publish(arrNames[counter]);
try {
Thread.sleep(30); // throws
} catch (InterruptedException ie) {
ie.printStackTrace();
}
counter++;
}
但是,原因是取消工作程序的代码(在actionListener中):
backgroundTask.cancel(true);
它明确告诉工作人员通过..中断线程来取消。从其api文档中:
mayInterruptIfRunning-如果应该中断执行此任务的线程,则为true;否则为false。否则,正在进行的任务将被允许完成
顺便说一句:捕获异常而不执行任何操作(从而有效地忽略中断)并不是最好的主意。在这种情况下,由于检查已取消状态,可能不会造成太大破坏。典型的工作程序实现要么在需要进行一些内部清理之后捕获并返回,要么根本不处理它。
昨天工作正常,一夜之间Windows7重新启动,现在Eclipse不会完成加载--旋转器显示“Eclipse SDK(未响应)”对话框“用户操作正在等待”完成“构建工作区”。Android SDK内容加载器保持在0%我尝试过: eclipse-clean delete c:\program files\eclipse\configuration.settings\org.eclipse.ui.id
我用IntelliJ创建了一个非常简单的流测试。 IntelliJ无法完成测试,并给了我错误 这导致假设响应程序流不执行任何操作。 启动器流被执行。我可以看到这一点,因为命令显示在日志中。但是,我不知道响应器流是否从未由发起方流启动,或者只是没有响应。也许你可以帮我。 谢谢
我是一个全新的计算机编程为CIS210和它的一个可怕的开始。下载了JDK9和Netbeans 8.2。Netbeans不允许我打开新项目或文件。没有错误消息或任何东西,几乎就像我没有点击它。屏幕保持空白,如下面的链接所示。快把我逼疯了。 单击“新建项目”时屏幕为空白:
我要把我的代码移到服务器上。这段代码可以在我在localhost上设置的自己的服务器上完美地运行和呈现数据库信息,但是当我从服务器上运行代码时,index.html中会显示一个错误,说明“IO没有定义”。无论出于什么原因,socket.io都无法被识别。此外,如果我在浏览器中键入localhost:3000,则不会显示任何内容。任何帮助都将不胜感激。 我有两个文件,server.js和index.
我是一个ameatur编码器,我最近开始使用pyplay,我一直在编码一些例子,我刚刚找到一个执行时无法正常加载的例子。我很确定我写对了,但我不知道为什么它不会运行。我运行Python 3.6和Pygame1.9.3。** *我知道pygame的版本是1.9,但我不知道最后一个数字。 这是代码:
我是javascript新手,我试图创建一个简单的表单验证。当我点击提交按钮时,什么也没发生。我已经看了一段时间的例子,我似乎不知道我哪里出错了。有什么建议吗: 就在这篇文章之后,我要把它分解开来,开始变得更小。但与此同时,我想另一组眼睛不会受伤,很可能我做了什么可怕的错误。 我意识到我只是在上面扔了很多代码,所以提前感谢您筛选它。