是否可以在Java / Swing的屏幕程序上编写画图?

时间:2018-07-18 08:05:08

标签: java swing

我正在使用Java Swing在屏幕程序上编写绘画。它在ubuntu linux上工作。但是窗口显示黑屏而不是透明面板。我包括了类似的示例代码。我的代码有什么问题?

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Example {

public static final Color COLOR_TRANSPARENT = new Color(0,0,0,0);

public Example() {
    Canvas drawArea = new Canvas();
    drawArea.setBackground(COLOR_TRANSPARENT);
    drawArea.setOpaque(true);

    JWindow drawingFrame = new JWindow();
    drawingFrame.setBackground(COLOR_TRANSPARENT);
    drawingFrame.setContentPane(drawArea);
    drawingFrame.pack();
    drawingFrame.setSize(640, 460);
    drawingFrame.setVisible(true);
    drawingFrame.setLocationRelativeTo(null);
    drawingFrame.setAlwaysOnTop(true);
}

public static void main(String[] args){
    SwingUtilities.invokeLater(Example::new);
}

class Canvas extends JPanel{

    private Image image;
    private Graphics2D g2;

    public Canvas() {
        super();
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                g2.setPaint(Color.RED);
                g2.fillOval(x-10, y-10, 20, 20);
                repaint(x-10, y-10, 20, 20);
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (image == null){
            image = createImage(getWidth(), getHeight());
            g2 = (Graphics2D) image.getGraphics();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setBackground(COLOR_TRANSPARENT);
            clear();
        }
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(image, 0,0, null);
    }

    public void clear(){
        System.out.println("clearing canvas ");
        g2.setComposite(AlphaComposite.Clear);
        g2.setBackground(COLOR_TRANSPARENT);
        g2.setColor(COLOR_TRANSPARENT);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.clearRect(0, 0, getWidth(), getHeight());
        g2.setPaint(Color.RED);
        g2.setComposite(AlphaComposite.SrcOver);
        repaint();
    }
}
}

这是我想要的屏幕截图。 screen shot for working example in ubuntu linux

示例代码已更新。现在,代码应该可以正常工作了,而无需其他任何代码。

1 个答案:

答案 0 :(得分:0)

对于Windows,我做了一些更改:

image = createImage(getWidth(), getHeight());
image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);

我使用BufferedImage可以将图像的Alpha值设置为透明。

//public static final Color COLOR_TRANSPARENT = new Color(0,0,0,0);
public static final Color COLOR_TRANSPARENT = new Color(0,0,0,1);

我将Alpha值设为非零,因为值零表示Java应用程序不会收到MouseEvent,因为它将传递给窗口下方的应用程序。