一尘不染

在Java中调整大小时绘画内容不可见

java

请注意,我尚未在Windows计算机上仅在Mac计算机上对此进行测试。 我不确定这是否也会在Windows计算机上发生…

当我调整Java应用程序的大小时,内容是不可见的。我已经找到一种方法来解决它 调整其大小,但不能 同时 在用户调整窗口的大小。

我没有使用Swing之类的东西,因为它会使我的二进制文件变慢(我认为)。

结构是这样的:

  • Frame 我的主窗口
    • Containe r的内容视图 main-window
      • Container 基于子视图,包括paint(Graphics g)-方法

我已将所有侦听器添加到其中 My main-window ,现在可以 在* 调整窗口大小 重新绘制 Content-view
*

public void componentResized(ComponentEvent e) {
    this.contentView.paint(this.contentView.getGraphics());
}

我谨防使用paint(getGraphics())-method并不是执行此操作的好方法,但是由于repaint()-method根本不执行任何操作,因此这是唯一可行的方法。

调整大小时,所有绘制的内容将变得不可见。但是,当我Button向自己添加-instance Content-view 并调整其大小时
Main-window ,按钮不会变得不可见。

能够追踪“live’-resize事件:

public void componentMoved(ComponentEvent e) {
    System.out.println("Live-resize");
}
  1. 当我开始调整大小时,不会调用此方法。
  2. 调整大小时,我在日志中每调整像素大小都会生成“实时调整大小”。
  3. 当我停止调整大小时,不调用此方法,componentResize-method会调用。

当我将这样的重绘方法(或正式的重绘方法)添加到像这样的“实时”调整大小事件中时,我仍然会得到输出,但是,它没有进行重绘

public void componentMoved(ComponentEvent e) {
    System.out.println("Live-resize");
    this.contentView.paint(this.contentView.getGraphics());
}

要么

public void componentMoved(ComponentEvent e) {
    System.out.println("Live-resize");
    this.contentView.repaint();
}

当我将我的应用程序最小化到扩展坞并再次最大化应用程序时,会发生相同的事情,我猜想需要使用相同的代码来解决此问题。

我没有使用Graphics2D,什么也没有Graphics

您能否解释一下如何重绘视图?

预先感谢,蒂姆


阅读 289

收藏
2020-09-08

共1个答案

一尘不染

好的,我终于解决了。

无需每次都在paint(Graphics g)-method 中重绘它,而是需要缓冲输出并仅重绘该图像(我有点希望Java像Obj-
C一样已经这样做了)。

public BufferedImage buffer;

public void redraw() {
    buffer = new BufferedImage(
            200, // height
            300, // width
            BufferedImage.TYPE_4BYTE_ABGR); // ABGR = RGBA, 4-byte (r, g, b, a) per pixel
    Graphics g = buffer.getGraphics();
    // do your drawing here
    if (this.getGraphics()) {
        // 'this' is already shown, so it needs a redraw
        this.paint(this.getGraphics()); // little hack
    }
}

public void update(Graphics g) {
    this.paint(g);
}

public void paint(Graphics g) {
    g.drawImage(buffer, 0, 0, this);
}

现在,当您最小化窗口并再次最大化它时,画作仍然存在。只是,窗口现在闪烁了0.1秒左右,但我并不在乎。

2020-09-08