簡體   English   中英

是否可以在Java / Swing的屏幕程序上編寫畫圖?

[英]Is it possible to write paint on screen program in 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();
    }
}
}

這是我想要的屏幕截圖。 ubuntu linux中工作示例的屏幕截圖

示例代碼已更新。 現在,代碼應該可以工作了,而無需其他任何代碼。

對於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,因為它將傳遞給窗口下方的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM