我在中有一个JButton
(swing
)JPanel
,如果按下该按钮,我将在for循环中对其列表中的列表执行任务EDT thread
。这样做时,我需要更新JProgressBar
。
问题是,当我按下JButton时,该任务是在事件调度线程(EDT)中执行的。因此,我无法更新JProgressBar
在主线程或UI线程中触发的事件。
现在,源代码对我不可用,因为我完全更改了源代码,并尝试使用Eclipse SWT
触发JProgressBar
Swing时JButton
,它变得混乱。
现在我得到了invalid thread access
错误,因为Display对象在单独的UI线程中运行。一次只显示Swing
JPanel
或Eclipse SWT Shell
。
我正在触发JPanel
使用JOptionPane
。
您需要长时间运行并在之外的单独Thread中更新进度栏值EDT
。在大多数情况下,这SwingWorker
是一个很好的方法。因此,在ActionListener
该按钮中,应将长时间运行的线程与EDT分开。您可以赤手空拳来完成此任务,Thread
并且专门SwingWorker
针对此类情况设计:
package graphics;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class GraphicDev extends JFrame{
private static final long serialVersionUID = 679207429168581441L;
//
private static final int FRAME_WIDTH = 300;
private static final int FRAME_HEIGHT = 100;
private int percent;
private JProgressBar progress;
public GraphicDev() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(dim.width/2-FRAME_WIDTH/2, dim.height/2-FRAME_HEIGHT/2, FRAME_WIDTH, FRAME_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
setLayout(new FlowLayout());
//
progress = new JProgressBar(0, 100);
progress.setStringPainted(true);
//
JButton actButton = new JButton("Start!");
actButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
for (long i = 0; i < 10000000000000L; i++) {
System.out.println(i);
if(i%200000 == 0){
progress.setValue(percent++);
}
if(percent >= 100){
break;
}
}
return null;
}
@Override
protected void done() {
JOptionPane.showMessageDialog(GraphicDev.this, "Done!");
}
}.execute();
}
});
//
add(actButton);
add(progress);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GraphicDev g = new GraphicDev();
g.setVisible(true);
}
});
}
}
希望这会有所帮助。
这是我的代码: 我在try块中的代码运行正常。我想触发catch块。我该怎么做。可以触发我的完全未来异常的输入是什么?
我有一个Primeface应用程序,其中我启动了一个包含表单的对话框。对话框有一个保存/取消按钮对。在这个对话框中,我无法调用on完成、onstart等方法。我在其他回复中看到原因是没有执行AJAX。但是,我不知道这种情况下的原因,因为命令按钮的类型是提交,并且应该有ajax="true"(默认情况下)。有人能在里面放一点光吗? 我的xhtml: 这是我的后盾: 谢谢!
下面的代码片段取自Google API文档中的一个示例。这段代码中有趣的部分是在两个
问题内容: 伙计们,我有一个小问题。我正在尝试实现以下方案: 用户打开主页,看到其他用户的列表,然后单击以将其添加到他的朋友列表。 我向服务器资源发出Ajax请求,以验证用户是否登录,如果是,我向另一个服务器资源发出另一个Ajax请求,以将其实际添加到用户的朋友列表中。 听起来很简单?这是我做的事情:创建了一个函数,该函数将向服务器发出第一个请求,以确定用户是否已登录。我使用方法发出此请求。这是我
我有一个聊天应用程序,当我在输入消息后单击按钮时,消息会发布到我的DynamoDB表中。该应用程序应该发布一次消息,但不知何故发布了两次。 管道如下: 客户端单击“发送”按钮-- 在SO的帮助下,我已经将问题隔离到我的Google Cloud函数异步调用Lambda,该函数将Lambda排队两次。 使用async,请求在实际执行之前排队。所以,如果您调用它一次,AWS将检查是否已经有一个正在执行,
问题内容: 我有一张上面有插入触发器的表。如果我从存储过程中的一条插入语句中向该表中插入6000条记录,那么在插入触发器完成之前,存储过程会返回吗? 只是为了确保我在正确地思考,触发器应该只被调用一次(我知道“被调用”不是正确的词)一次,因为只有1个insert语句,对吗? 我的主要问题是:即使触发器尚未完成,存储过程也会完成吗? 问题答案: 您的插入触发器将针对整个插入语句运行一次。这就是为什么