当前位置: 首页 > 面试题库 >

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

姜聪
2023-03-14
问题内容

请注意,我尚未在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

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

预先感谢,蒂姆


问题答案:

好的,我终于解决了。

无需每次都在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秒左右,但我并不在乎。



 类似资料:
  • 我使用JFreeChart(1.0.14)中的来显示一些图表。布局由MigLayout处理,所有工作都很好。然而,我不时有奇怪的行为。当图形改变时,面板的最小大小有时也会改变。我不是在代码中设置它,而是将一切都留给Miglayout。 null

  • 我有定义了left、right和top约束的NSTextField(没有设置bottom约束)。我需要NSTextField增长,如果内容不能容纳在其中,并减少大小,如果有未使用的空间。 现在我有了:如果NSTextField有多行文本或太多内容,它会以奇怪的行为自动扩展,而且NSTextField在窗口调整大小时不会减小自己的大小。 在Swift上,我还没有找到任何简单的解决方案来解决这个问题(

  • 我注意到在添加滚动条时会调整高度内容的大小(因为内容超过了宽度)。 密码... 注意:如果我使用,它会在最大化窗口时增加边框之间的间距,我不希望这样。 正如您所看到的,第2行被切断了,是否有必要不调整它的大小(除了将它设置为,如果最大化窗口,它仍然显示条形)?

  • 问题内容: 一旦我在代码中使用了渐变,在调整大小时就不会完成重新绘制,而在调整大小时 会得到类似的信息(已调整大小的黑色矩形,请参见下面的链接中的图像)。当我停止调整大小时,一切都会 再次绘制,但只有那时。 如果我不使用,;我会快速重画 http://gui-builder.com/C41142775162.rar 我尝试调整大小,尝试拖动鼠标时却 什么也没有。 这是一些SSCCE(对不起,我之前

  • 一直以来,我都在开发一款分辨率为800x480(流行手机分辨率)的应用程序。 我的画布HTML: 现在,为了使其全屏显示其他分辨率,我在调整大小事件后执行以下操作: 这是可行的,但问题是我不能以这种方式保持纵横比。800x480是4:3,但是如果我在5:3的手机上运行这个应用程序,有些东西(尤其是圆圈)看起来会被拉伸。 有没有什么方法可以让它在所有分辨率下看起来都很好,而不必为每个纵横比创建一组独

  • 已经建立了一个小的测试SWING应用程序,有三个面板。一个主JPanel,包含两个较小的JPanel。一个在左边(板面板),另一个在右边(侧板)。通过调用min、preferred和max size方法,两个内部面板都被设置为请求的特定大小。右面板中的一个按钮将父JFrame设置为not re-sizable。在父帧设置为不可调整大小之前,一切看起来都很好,这会导致(?!)调整框架和主面板的大小,