所以这个问题有两个部分,我认为可能是相关的,而且大多是抽象的。简而言之,这就是我正在做的事情:
我有一个JFrame
带 aJPanel
和一些child
JPanels
每个都有 3JButtons
的。我还为 (ie ) 创建了一个JComponent
调用,它允许我在 JPanel 和按钮上进行绘制。glassPanel
JFrame
myJFrame.setGlassPane(glassPanel)
(1) 基本上是通过单击 a 上的所有 3 个按钮触发的JPanel
,glassPanel
设置为Visible
(然后似乎调用paintComponent()
)。这与第一个问题有关。
(2) 在paintComponent()
我使用双缓冲区绘制和绘制矩形和图像到glassPanel
. 这与第二个问题有关。
这是我相关的 GlassPanel 类代码(这不是 SSCCE,因为它现在是一个抽象问题):
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
public class GlassPanel extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
setDoubleBuffered(true);
Graphics2D g2 = (Graphics2D) g;
g2.drawRect(x,y,width,height);
g2.fillRect(x,y,width,height);
g2.drawImage(img, x, y, this);
}
}
System.out.print
通过在 paintComponent() 方法中放置一个语句,我可以看出它被连续调用并且也是异步调用的。关于我认为调用的方式,请参见(1)。另外,假设我绝对确定repaint()
代码中的任何地方都没有调用(我已经检查了很多次)。这是第一个问题的基础。
我第一次单击 3 个按钮时,一切顺利。矩形和图像都立即绘制。但是,当我单击接下来的 3 个按钮时(此时,glassPanel
已经是setVisible(true)
并且第一个矩形和图像仍在屏幕上,绘制在前 3 个按钮上),第二个矩形和图像仅部分加载。JFrame
当我在运行程序的 Eclipse 窗口上单击并离开时,paintComponent()
每次调用的次数都会快速增加相同的数量,并且部分加载的图像和矩形会立即完全显示在后台JFrame
。当我单击返回 JFrame 时,调用次数又增加了一个确切的数量)。这是第二个问题的基础。
更新:这是我读到的东西:
此外,当 GUI 被另一个窗口覆盖然后变得未覆盖时,绘画系统调用 paintComponent 方法,绘画区域等于新未覆盖的区域。
我的问题是:
(1) 为什么paintComponent()
没有 a 可能会被称为这么多repaint()
?或者,一个类似的问题,什么可能调用paintComponent()?
更新:在做了一些数学运算之后,我坚信每个组件(所有按钮和面板)都会连续调用它。但是,仍然没有调用 repaint()...
(2) 为什么在我从 JFrame 窗口获得焦点之前,图像会部分加载?
请注意,我已经尝试了很多事情:(a)创建我自己的 doubleBuffer 并且不使用双缓冲区(我知道它主要用于动画),(b)覆盖而不是覆盖paintComponent()
,(c)绘制而不是绘制图像(矩形仍然加载需要时间),(d)绝对确定没有repaint()
,(e)使用和不使用SwingUtilities.invokeLater(new Runnable() {
public void run() { //stuff});
,(f)if
只做了一次 setVisible(true) 的声明。
如果必须,我可以尝试通过 SSCCE,但我确实认为这些更抽象。谢谢!