【问题标题】:Basic Java Swing JFrame Repainting [duplicate]基本Java Swing JFrame重绘[重复]
【发布时间】:2017-06-19 08:20:09
【问题描述】:

Swing 新手,但 Java 不熟悉。我正在尝试以下方法:

public void actionPerformed(ActionEvent e) {

methodA();
pane.repaint();
methodB();
pane.repaint();

}

其中 methodB() 需要很长时间。我希望它绘制两次,但第一次绘制调用从未发生。好像我做到了:

public void actionPerformed(ActionEvent e) {

methodA();
methodB();
pane.repaint();

}

对不起,如果这是基本的,但我已经尝试搜索,但我仍然不明白为什么。

我试过直接调用paint,它按预期工作,除了应用程序在每次重绘时闪烁。

【问题讨论】:

  • 不同的场景,不同的调用,但相同的行为和相同的解决方案:Java swing GUI freezes
  • repaint()很快(不是立即)绘制组件的请求。但是如果methodB 需要很长时间,它会阻塞事件派发线程,并且在完成之前不会重新绘制任何内容。考虑在另一个线程中运行methodB

标签: java swing jframe repaint


【解决方案1】:

actionPerformed 在事件调度线程 (EDT) 中调用,该线程也是执行绘制的地方,repaint 仅标记要重新绘制的组件。这意味着只有在actinPerformed 执行完成后才能进行绘制。

不应在 EDT 中执行长时间运行的任务,请使用 SwingWorker 或其他线程。

表示学习Swing's Threading Policy

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2012-01-25
    • 2019-11-27
    • 1970-01-01
    • 2017-08-09
    • 2016-03-10
    • 2012-12-16
    相关资源
    最近更新 更多