首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用桌面作为清晰的白板

使用桌面作为清晰的白板
EN

Stack Overflow用户
提问于 2013-06-18 00:15:19
回答 1查看 271关注 0票数 2

一些软件使用显示器作为一块清晰的白板来绘图。白板是透明的,你可以看到透明白板下面的桌面

那么这是怎么可能的呢?

我的意思是,在Java语言中,这是不是就像让JFrame变成屏幕大小,并使其对绘图透明一样,或者这是如何实现的?

我们有一个类似的需求,所以我们正在尝试理解如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 01:25:02

有一种方法可以做到这一点:创建一个透明窗口,在该窗口上放置一个显示BufferedImageJLabel。当用户按下并拖动鼠标时,您将在BufferedImage上绘制并重新绘制标签以更新内容。

以下是一些入门示例代码:

代码语言:javascript
复制
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestTransparentFrame extends JLabel {

    private boolean drawing = false;
    private Point lastPoint;

    private BufferedImage image;

    public TestTransparentFrame() {
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                updateImage();
            }
        });
        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                drawing = true;
                lastPoint = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                drawing = false;
                lastPoint = null;
            }

            @Override
            public void mouseExited(MouseEvent e) {
                drawing = false;
                lastPoint = null;
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                if (drawing && lastPoint != null) {
                    Graphics graphics = image.getGraphics();
                    graphics.setColor(Color.RED);
                    ((Graphics2D) graphics).setStroke(new BasicStroke(5.0f));
                    graphics.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
                    repaint();
                    lastPoint = e.getPoint();
                }
            }
        };
        addMouseListener(mouseAdapter);
        addMouseMotionListener(mouseAdapter);
    }

    protected void updateImage() {
        if (image == null || image.getWidth() < getWidth() || image.getHeight() < getHeight()) {
            if (image == null) {
                image = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            } else {
                BufferedImage newImage = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight(),
                        BufferedImage.TYPE_INT_ARGB);
                newImage.getGraphics().drawImage(image, 0, 0, null);
                image = newImage;
            }
        } else {
            image = image.getSubimage(0, 0, getWidth(), getHeight());
        }
        setIcon(new ImageIcon(image));
    }

    protected void initUI() {
        JFrame frame = new JFrame(TestTransparentFrame.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.setBackground(new Color(255, 255, 255, 1));
        TestTransparentFrame comp = new TestTransparentFrame();
        frame.setContentPane(comp);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestTransparentFrame().initUI();
            }
        });
    }

}

结果是:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17152163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档