当前位置: 首页 > 知识库问答 >
问题:

SwingUtilities.invoke后来不工作预期

闾丘选
2023-03-14

我正在开发一个用Java编写的并发画布,这会让用户觉得他们在并行地绘制画布。

为了实现用户感知的并行性,我让他们创建这些可运行的对象,然后使用SwingUtilities将它们放在EventQueue上。调用器()。

为了测试它,我用几个线程模拟了用户,并在每次调用invokeLater()之间增加了一点延迟(大约50毫秒),以查看绘图是否真的是并行进行的。

问题是,尽管它可以很好地处理invokeLater()调用之间增加的延迟,但去掉该延迟有时会导致正确绘制图形,有时会部分绘制,有时会消失,而在其他时间则不会绘制。

我对可能出现的问题感到困惑,所以如果有人有任何想法,请告诉我。

以下是注释掉延迟的代码:

public void run(){
    //add tasks on to the event queue of the EDT 
    for(int i = 0; i<numLines; i++){
        DrawLineTask task = new DrawLineTask(g, x1, y1+i, x2, y2+i, lineColor);
        SwingUtilities.invokeLater(task);
//          try {
//    Thread.sleep(new Double(Math.random()*50).longValue());//random sleeping times to             make it appear more realistic
//          } catch (InterruptedException e) {
//              e.printStackTrace();
//          }
    }

干杯

编辑:这是所要求的DrawLine任务的代码。它非常简单,因为它只是Runnable类的扩展,在给定参数下使用标准Java函数绘制一条线。

public class DrawLineTask implements Runnable {
Graphics g;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
Color color = Color.BLACK;

public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2){
    this.g = g;
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
}

public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2, Color color){
    this.g = g;
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    this.color = color;
}

@Override
public void run() {
    g.setColor(color);
    g.drawLine(x1, y1, x2, y2);
}

}

共有1个答案

季小云
2023-03-14

顺便说一句,你不应该保留对图形对象的引用,并在需要时在其上绘制。相反,您应该等待Swing调用paintComponent()方法,然后用这个方法绘制图形。

因此,您的任务应该只更改组件的状态,并要求异步或同步重绘(使用repaint()油漆立即())。然后,Swing将调用带有图形对象的油漆组件()方法,您可以使用该对象根据组件的状态绘制适当的行。

看见http://java.sun.com/products/jfc/tsc/articles/painting/更多细节和解释。

 类似资料:
  • 问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir

  • 为什么我的搜索函数永远不会执行“else”(如果没有找到结果,else应该回显文本)?我在尝试显示所有结果时也遇到了一些问题(没有选择搜索标准,只需按搜索按钮)。我将上传页面的全部代码,因为我不知道您是否也需要HTML部分来解决问题。我知道这是一个很大的代码块,但如果可以的话,请帮忙。谢谢 以下是我的代码链接:http://pastebin.com/BXe1C0dr

  • 问题内容: 问题出在此CSS和HTML之内。 HTML CSS 这两行CSS都不应该 以“ complete”类 为目标的 最后一个li元素 吗? jQuery中的此查询也不针对它: 但这确实做到了: 问题答案: 该选择器用于选择父的最后一个子元素。它不能用于选择给定父元素下具有特定类的最后一个子元素。 复合选择器的另一部分(位于之前)指定了附加条件,最后一个子元素必须按顺序满足才能被选择。在下面

  • 我正在学习AOP Spring并尝试一些示例。关于@AfterBack ning,我所理解的是,只有当目标成功返回并且与切入点匹配时,才会调用该方法。然而,在我的例子中,如下所示,我有一个切入点,它定义了所有只返回字符串的方法,但它调用了所有空方法以及返回字符串的方法。 我的建议: 请在下面找到我的Impl课程: 请在下面找到我的MainApp类: 我原本希望只调用getCustomer(),因为

  • 问题内容: 根据JavaDoc for ,该函数在比较期间不考虑比例。 现在,我有一个测试用例,看起来像这样: 我希望函数返回的值是10,小数位数为10。打印该值可显示预期的结果。但是该功能似乎并未按照我认为的方式工作。 这里发生了什么? 问题答案: 并 没有 代表0.7。 它代表0.69999999999999999999555910790149937383830547332763671875(

  • 问题内容: 我是否错过了明显痛苦的事情?还是世界上没有人真正使用java.util.BitSet? 以下测试失败: 我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false且从未设置为任何值… (请注意,在构造函数中显式设置BitSet的大小无效,例如: 问题答案: 人们确