Tag: event dispatch thread

我正在尝试使用线程在applet中移动一个球,但它没有移动

我正在尝试使用线程在applet中移动一个球,但它没有移动。 任何人都可以帮助我作为applet的新手并继续进行游戏开发。这里的参考是我的代码 public class ballGame extends JApplet implements Runnable { int x_pos=50; int y_pos=100; int rad=10; Thread t; public void start() { super.start(); t=new Thread(“t”); t.start(); } public void paint(Graphics g) { super.paint(g); g.setColor(Color.red); setBackground(Color.BLACK); g.drawOval(x_pos,y_pos,2*rad,2*rad); while(true) { x_pos++; //validate(); repaint(); try { Thread.sleep(100); } catch(Exception e) { e.printStackTrace(); } }//end of while }//end of […]

如何在Java Swing中实现空闲任务

我有一个GUI应用程序,变得非常慢。 我想开始介绍各种GUI任务的时间安排 – 但是,我们的许多GUI操作会触发其他操作,然后“稍后调用”以触发其他操作。 最终,这一切都安定下来,没有什么可做的了。 这时,我想停止计时器并报告GUI“动作”花了多长时间。 我认为这样做的方法是实现一个名为invokeOnceIdle(Runnable task) 。 只有在AWTEventQueue为“空”时,该方法才会执行提供的任务。 即提供的“任务”应该是队列中的最后一件事。 一种方法是,如果有办法为SwingUtilities.invokeLater指定“最低”优先级 – 但这是不可能的。 我接下来看看是否可以“invokeLater”一个Runnable来检查事件队列是否为“空” – 但是没有公开的方法来查看事件队列是否实际为空。 最好的方法是什么?

在多任务应用程序中管理GUI和EDT

我开发了一个用于创建和提取存档的Java应用程序 – 比如WinRAR 。 您可以使用multithreading同时创建多个归档。 最近,我希望在每次创建时在新的JFrame中以JProgressBar的forms在存档创建期间添加信息状态。 但我的问题是在新的状态框架和创建存档的线程中生成信息。 这就是我在存档线程中创建JFrame以更新当前进度条的原因。 但就像我可以在各种信息源和你的答案/评论中阅读它,它反对Java Swing和性能; 我不能在EDT的其他地方创建摆动对象。 但那么,我应该如何解决我的问题呢? 如何在存档的写入和状态JFrame(使用JProgressBar)之间建立通信? 编辑: 我实现了SwingWorker来管理我的应用程序中的GUI。 现在已经完成,我还有一个问题: 使用SwingWorker,如何使用状态框架按钮上的事件对后台任务执行操作? (示例:暂停压缩或停止压缩。)

当我重新涂抹太多时,停止在摇摆中闪烁

我正在制作一个带有tilemap的RPG。 为了生成tilemap,我循环通过一个二维数组,但这意味着当我重新绘制时,我必须每次都这样做。 如果我重画太多屏幕闪烁,我怎么能阻止这个。 package sexyCyborgFromAnOtherDimension; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Timer; import java.util.TimerTask; import javax.swing.JPanel; @SuppressWarnings(“serial”) public class Game extends JPanel { KeyLis listener; int mapX = 20; int mapY = 20; boolean up = false; boolean down = false; boolean […]

是否可以在不使用EDT的情况下在Java Swing中执行活动渲染?

我正在研究使用缓冲策略和Javadoc上描述的以下技术: // Main loop while (!done) { // Prepare for rendering the next frame // … // Render single frame do { // The following loop ensures that the contents of the drawing buffer // are consistent in case the underlying surface was recreated do { // Get a new graphics context every time through […]

SwingWorker中的error handling

我的问题是基于理论的问题,但它确实满足了我的特定需求。 当你的SwingWorker抛出a)你可以预料到并且b)需要从中恢复并继续的exception时,你会怎么做,但是你想通知用户这个错误已经发生了? 如何获取预期的exception并通知用户而不违反“ doInBackground()没有Swing代码”规则? 考虑到这个问题,我已经开发了一个SSCCE,我想提出下面的问题。 SSCCE: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.ExecutionException; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public class Test { public static void main(String args[]) { final JFrame frame = new JFrame(); JButton go = new JButton(“Go.”); go.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) […]

如何更改进度条和标签的值?

仅当方法结束时, JLabel和JProgressBar才会更改其值。 this.desSave.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DownloadXml(); } }); private void DownloadXml() throws Exception { Integer a = 456; int value = (1000 / a) – 1; this.numDes.setText(“0” + “/” + a); for (int i = 0; i < a; i++) { saveXml(ligas.get(i),i,path); this.numDes.setText(i + "/" + a); //this is […]

JFrame在连续运行代码时冻结

我在使用JFrame时遇到问题,在连续运行代码时会冻结。 以下是我的代码: 点击btnRun ,我调用了函数MainLoop() : ActionListener btnRun_Click = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { MainLoop(); } }; MainLoop() : void MainLoop() { Hopper = new CHopper(this); System.out.println(Hopper); btnRun.setEnabled(false); textBox1.setText(“”); Hopper.getM_cmd().ComPort = helpers.Global.ComPort; Hopper.getM_cmd().SSPAddress = helpers.Global.SSPAddress; Hopper.getM_cmd().Timeout = 2000; Hopper.getM_cmd().RetryLevel = 3; System.out.println(“In MainLoop: ” + Hopper); // First connect to the validator […]

如何在EDT上运行JOptionPane?

我仍然遇到空白的JOptionPane问题。 基于SO和Java Docs的研究 ,这显然与不使用EDT 。 我的问题是EDT及其方法究竟如何适用于JOptionPane ? 例如,终端错误输出清楚地表明下面的JOptionPane没有在EDT上运行。 特别缺少什么, Runnable东西怎么样? import javax.swing.*; public class PaneDemo { public static void main(String[] args) { final String[] TEXT ={ //message “Hello, World!”, //title “Greeting”};//end TEXT showMyPane(TEXT); }//end main public static void showMyPane(final String[] TEXT) { JOptionPane.showMessageDialog(null, TEXT[0], TEXT[1], JOptionPane.INFORMATION_MESSAGE); if(!SwingUtilities.isEventDispatchThread()) { System.err.println(“Err: GUI failed to use EDT.”); }//end […]

我怎么知道我是否在事件发送线程上?

1.考虑我的代码是在我的JPanel的某些行上,我是自动在EDT上吗? 2.对于不属于GUI,JPanels或其他视图类,简单逻辑类的所有其他类的同名问题。 3.如果我有JPanel我正在播放音乐,那么音乐应该在事件发送线程上运行还是在非EDT的其他线程上运行(为了不阻止GUI,尽管我没有遇到任何运行问题来自EDT)? 注意:我想要一般规则如何在不使用SwingUtilities.isEventDispatchThread()情况下知道它 谢谢