java - 从 "Filthy Rich Clients"开始理解Swing代码

标签 java swing graphics2d

下面是 Romain Guy 和 Chet Haase 的“肮脏的富客户”中的代码

private class ImageViewer extends JComponent {
    private BufferedImage image, landscape;

    private ImageViewer() {
        try {
            image = ImageIO.read(new File("picture.png"));
            landscape = ImageIO.read(new File("landscape.jpg"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
            BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = temp.createGraphics();

        if (shadow.isSelected()) {
            int x = (getWidth() - image.getWidth()) / 2;
            int y = (getHeight() - image.getHeight()) / 2;
            g2.drawImage(image, x + 4, y + 10, null);

            Composite oldComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 0.75f));
            g2.setColor(Color.BLACK);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setComposite(oldComposite);
            g2.drawImage(image, x, y, null);
        } else {
            int x = (getWidth() - image.getWidth()) / 2;
            int y = (getHeight() - image.getHeight()) / 2;
            g2.drawImage(image, x, y, null);

            Composite oldComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.SrcIn);
            x = (getWidth() - landscape.getWidth()) / 2;
            y = (getHeight() - landscape.getHeight()) / 2;
            g2.drawImage(landscape, x, y, null);
            g2.setComposite(oldComposite);
        }

        g2.dispose();
        g.drawImage(temp, 0, 0, null);
    }
}

当复选框被选中时,它是代码的一部分,以获取以下不同状态的输出:- enter image description here

我不明白的是

1)行是什么

BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);

这样做是因为如果我只编写以下代码并运行,则不会在输出中获得任何内容。

BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = temp.createGraphics();

    if (jcb.isSelected()) {
        int x = (getWidth() - image.getWidth()) / 2;
        int y = (getHeight() - image.getHeight()) / 2;
        g2.drawImage(image, x + 4, y + 10, null);
           }

2) 创建'temp' bufferedImage 后需要获取g2 是什么?我不能像这样直接做吗

Graphics2D g2=(Graphics2D)g.create();

3)TYPE_INT_RGB 和 TYPE_INT_ARGB 之间的实际区别是什么?

最佳答案

这是双缓冲: http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html

您首先在离屏图像上绘制,在本例中,该图像由变量 temp 中引用的 BufferedImage 对象支持;然后你对屏幕外的图像做任何事情;最后,您通过 g.drawImage(temp, ...) 在组件上打印结果。这不是为了让用户看到由于直接在屏幕上构建图像而导致的故障或伪影。

关于java - 从 "Filthy Rich Clients"开始理解Swing代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13108536/

相关文章:

java - Jarsigner 错误 : java. lang.RuntimeException

java - 使用Java LocalTime.parse方法

java - 打印标签 Java、循环(?)

Java graphics2D fillRect 不能正确处理半透明颜色

java - 无法使正则表达式正常工作

java - org.apache.axiom.om 中的 "om"是什么意思?

java - AWT 与 Swing 的对比……为什么要使用 Swing?

java - 如何从给定id的自动数据库检索数据?

java - 在 Java 中画一条线 - 线不可见

java - 如何将小程序的内容转为图片?