java – 在JFrame外部,屏幕上的任何位置创建一个点/像素

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

在JFrame区域外绘制的任何方法?

解决方法:

您可以创建具有完全透明度的全屏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);
    }
}
上一篇:java – 使用Swing在窗格中选择文件


下一篇:java – 为什么我的项目没有出现在JFrame中?