创建JFrame的屏幕上的点/像素之外的任何位置 [英] Creating a dot/pixel outside of a JFrame, any location on the screen

查看:158
本文介绍了创建JFrame的屏幕上的点/像素之外的任何位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够在屏幕上为我的Java应用程序上显示百分点。在某些时候,我希望能够让用户移动这些点并拖动周围。目前,我遇到了麻烦试图在屏幕上画一个点/像素一个JFrame之外。

I would like the be able to display points on the screen for my Java application. At some point I want to be able to let the user move the points and drag them around. Currently I am having trouble trying to draw a single dot/pixel on the screen outside of a JFrame.

您的JFrame区以外得出任何方式?

Any ways to draw outside of your JFrame area?

推荐答案

您可以创建一个全屏幕的JFrame 完全透明,并绘制在一个面板或图像。就像这样,它使用一个自定义面板以创建鼠标手电筒效应。我们可以看到,无论鼠标指向,屏幕的其余部分变暗。

You might create a full screen JFrame with full transparency, and draw to a panel or image on that. Much like this, which uses a custom panel to create a 'flashlight' effect for the mouse. We can see wherever the mouse is pointing, the rest of the screen is darkened.

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);
    }
}

这篇关于创建JFrame的屏幕上的点/像素之外的任何位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆