【问题标题】:Creating a dot/pixel outside of a JFrame, any location on the screen在 JFrame 之外,屏幕上的任何位置创建一个点/像素
【发布时间】:2013-08-17 04:12:10
【问题描述】:

我希望能够在我的 Java 应用程序的屏幕上显示点。在某些时候,我希望能够让用户移动这些点并拖动它们。目前,我在尝试在 JFrame 之外的屏幕上绘制单个点/像素时遇到了麻烦。

有什么方法可以在 JFrame 区域之外绘制?

【问题讨论】:

  • 不可能(使用纯 Java)。您可以“破解”它,但存在无数问题,因为鼠标事件往往会消失并变得无法追踪......
  • 如果您不关心与应用程序后面的屏幕保持交互,您可以使用Robot 捕获屏幕,在全屏窗口上显示捕获,然后在其上绘制.很多俗气的屏幕保护程序都是这样工作的。
  • 我要制作一个屏幕保护程序...我猜它是机器人类。谢谢!

标签: java swing awt fullscreen


【解决方案1】:

您可以创建一个具有完全透明度的全屏JFrame,并在其上绘制面板或图像。就像这样,它使用自定义面板为鼠标创建“手电筒”效果。我们可以看到鼠标指向的任何地方,屏幕的其余部分都变暗了。

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import javax.swing.*;
import javax.swing.event.*;

public class TranslucentWindowTest {

    public static void main(String[] args) {
        // Determine if the GraphicsDevice supports translucency.
        GraphicsEnvironment ge =
                GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();

        // If translucent windows aren't supported, exit.
        if (
                !gd.isWindowTranslucencySupported(
                GraphicsDevice.WindowTranslucency.TRANSLUCENT) ||
                !gd.isWindowTranslucencySupported(
                GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)
                ) {
            System.err.println(
                    "Translucency is not fully supported");
            System.exit(1);
        }

        Runnable r = new Runnable() {

            @Override
            public void run() {

                final JFrame f = new JFrame();
                f.setUndecorated(true);
                f.setAlwaysOnTop(true);
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setExtendedState(JFrame.MAXIMIZED_BOTH);
                // first set the frame invisible..
                f.setBackground(new Color(0, 0, 0, 0));

                final SpinnerNumberModel snm = new 
                        SpinnerNumberModel(98, 0, 100, 1);

                // create a custom panel to create moment by moment 
                // screen painting
                JPanel panel = new JPanel() {

                    float[] fractions = {.2f,.8f};
                    Color[] colors = {
                        new Color(255,255,255,0),
                        new Color(0,0,0,250)
                    };

                    @Override
                    protected void paintComponent(Graphics g) {
                        Point2D pnt = MouseInfo.getPointerInfo().getLocation();
                        if (g instanceof Graphics2D) {
                            colors[1] = new Color(
                                    0f,0f,0f,snm.getNumber().floatValue()/100f);

                            Graphics2D g2d = (Graphics2D) g;
                            Paint p = new RadialGradientPaint(
                                    pnt, 200f, fractions, colors,  
                                    MultipleGradientPaint.CycleMethod.NO_CYCLE);
                            g2d.setPaint(p);
                            g2d.fillRect(0, 0, getWidth(), getHeight());
                        }
                    }
                };
                f.setContentPane(panel);

                ActionListener mouseAnimate = new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        f.repaint();
                    }
                };
                Timer timer = new Timer(50,mouseAnimate);
                f.pack();

                JPanel spinners = new JPanel(
                        new FlowLayout(5, 5, FlowLayout.CENTER));

                f.setOpacity(snm.getNumber().intValue() / 100f);
                JSpinner translucency = new JSpinner(snm);
                spinners.add(new JLabel("Translucency"));
                spinners.add(translucency);
                ChangeListener trListener = new ChangeListener() {

                    @Override
                    public void stateChanged(ChangeEvent e) {
                        f.setOpacity(snm.getNumber().intValue() / 100f);
                    }
                };
                translucency.addChangeListener(trListener);

                f.setVisible(true);

                // run timer as long as the dialog is open..
                timer.start();
                JOptionPane.showMessageDialog(f, spinners);
                timer.stop();

                f.setVisible(false);
                f.dispose();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多