创建JFrame的屏幕上的点/像素之外的任何位置 [英] Creating a dot/pixel outside of a JFrame, any location on the screen
问题描述
我希望能够在屏幕上为我的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屋!