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

标签 java swing graphics xor

当我在图形中遇到我不明白的行为时,我试图在图形中使用 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 中创建了它,因为当时我没有截图)。

最佳答案

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

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/

相关文章:

r - 更密集的 ggplot 图形

java - 在 Java 中绘制带轮廓的字符串有什么更好的方法吗?

java - 将自定义对象列表转换为ArrayList

java - 当我使用 findElements 时,List<WebElement> 接口(interface)是如何实现的?

java - 字符串连接 : concat() vs "+" operator

Java Swing简单程序

c# - 将 UV 映射到凸起的三角形带

java - 是否可以用按钮隐藏键盘?

java - 可调整大小的 Swing 布局,其中按钮根据可变尺寸排列

Java Swing keyEvent 与 keyPressed/keyReleased - 不同的键代码?