gpt4 book ai didi

Java 在 XOR 模式下绘制组件不绘制任何内容

转载 作者:行者123 更新时间:2023-12-04 04:56:11 24 4
gpt4 key购买 nike

当我在 Graphics 中遇到我不理解的行为时,我试图在 Graphics 中使用 XOR 模式在平面背景上绘制 1 位彩色纹理。

这是我的意思的一个例子,孤立的:

package teststuff;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class XORTest extends JFrame {

public XORTest() {
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 400);
setIgnoreRepaint(true);
setResizable(false);
setVisible(true);
createBufferStrategy(2);
Graphics graphics = getBufferStrategy().getDrawGraphics();
graphics.setColor(Color.black);
graphics.fillRect(0, 0, getWidth(), getHeight());
graphics.setColor(Color.green);
graphics.fillRect(30, 40, 100, 200);
graphics.setXORMode(Color.white); // (*)
graphics.fillRect(60, 80, 100, 200);
graphics.dispose();
getBufferStrategy().show();
}


public static void main(String[] args) {
XORTest test = new XORTest();
}
}

如果我取消注释标有 (*) 的行,则会按预期绘制两个绿色矩形。如果我离开它,则不会在组件中绘制任何内容,甚至没有预先绘制的黑色背景或绿色矩形。更奇怪的是,它工作过一次。我之前的颜色是 Color.green 而不是白色。在我更改它之后,它按预期绘制。但是当我关闭应用程序并再次启动它时,它不再工作了,从那以后就再也没有了。

这是java中的错误吗?在我的 jre?图形的未记录行为?我在 Windows 上并在 jdk7 上运行示例。

截图: Imgur album because it won't let me post 3 links

第三个屏幕截图是上面的代码,第一个带有 (*) 注释,第二个是它工作时的样子(我在 GIMP 中创建了它,因为我当时没有截图)。

最佳答案

如果没有令人信服的相反理由,覆盖 paintComponent() 更容易、更可靠。在 JPanel ,默认情况下是双缓冲的。出于令人信服的理由,请遵循 BufferStrategy and BufferCapabilities 中的指南.另请注意,

  • 覆盖 getPreferredSize() 指定组件的首选大小。
  • Swing GUI 对象只能在 event dispatch thread 上构建和操作。 .

  • test image
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    /**
    * @see https://stackoverflow.com/a/16721780/230513
    */
    public class Test {

    private void display() {
    JFrame f = new JFrame("Test");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new XORPanel());
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }

    private static class XORPanel extends JPanel {

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(190, 320);
    }

    @Override
    protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    graphics.setColor(Color.black);
    graphics.fillRect(0, 0, getWidth(), getHeight());
    graphics.setColor(Color.green);
    graphics.fillRect(30, 40, 100, 200);
    graphics.setXORMode(Color.white);
    graphics.fillRect(60, 80, 100, 200);
    }
    }

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    new Test().display();
    }
    });
    }
    }

    关于Java 在 XOR 模式下绘制组件不绘制任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719980/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com