用Java绘制屏幕

用Java绘制屏幕,java,drawing,system,Java,Drawing,System,我想用Java创建一个助手应用程序。。其行为类似于:无论何时通过全局快捷方式调用,它都可以在屏幕上绘制一些文本(不是在自己的应用程序窗口上,而是在屏幕顶部) 类似的帖子也是,但我想用Java实现这一点 当我搜索类似“java绘图屏幕”的内容时,我只能得到很多关于Java2D的教程 我想检查:1)是否可以利用Java中的其他应用程序?2) 如果不可能,在Mac/Ubuntu中是否有其他选择 非常感谢 (旁注:我知道java不支持全局快捷方式。我正在尝试其他方法来解决这个问题,这里没有相关内容)只需

我想用Java创建一个助手应用程序。。其行为类似于:无论何时通过全局快捷方式调用,它都可以在屏幕上绘制一些文本(不是在自己的应用程序窗口上,而是在屏幕顶部)

类似的帖子也是,但我想用Java实现这一点

当我搜索类似“java绘图屏幕”的内容时,我只能得到很多关于Java2D的教程

我想检查:1)是否可以利用Java中的其他应用程序?2) 如果不可能,在Mac/Ubuntu中是否有其他选择

非常感谢


(旁注:我知道java不支持全局快捷方式。我正在尝试其他方法来解决这个问题,这里没有相关内容)

只需在屏幕上放置一个透明的窗口并绘制它即可。透明窗口甚至支持点击,所以效果就像你直接在屏幕上画画一样

使用Java 7:

Window w=new Window(null)
{
  @Override
  public void paint(Graphics g)
  {
    final Font font = getFont().deriveFont(48f);
    g.setFont(font);
    g.setColor(Color.RED);
    final String message = "Hello";
    FontMetrics metrics = g.getFontMetrics();
    g.drawString(message,
      (getWidth()-metrics.stringWidth(message))/2,
      (getHeight()-metrics.getHeight())/2);
  }
  @Override
  public void update(Graphics g)
  {
    paint(g);
  }
};
w.setAlwaysOnTop(true);
w.setBounds(w.getGraphicsConfiguration().getBounds());
w.setBackground(new Color(0, true));
w.setVisible(true);

如果系统不支持每像素半透明或不提供点击行为,您可以通过设置窗口
形状来尝试每像素透明度:

Window w=new Window(null)
{
  Shape shape;
  @Override
  public void paint(Graphics g)
  {
    Graphics2D g2d = ((Graphics2D)g);
    if(shape==null)
    {
      Font f=getFont().deriveFont(48f);
      FontMetrics metrics = g.getFontMetrics(f);
      final String message = "Hello";
      shape=f.createGlyphVector(g2d.getFontRenderContext(), message)
        .getOutline(
            (getWidth()-metrics.stringWidth(message))/2,
            (getHeight()-metrics.getHeight())/2);
      // Java6: com.sun.awt.AWTUtilities.setWindowShape(this, shape);
      setShape(shape);
    }
    g.setColor(Color.RED);
    g2d.fill(shape.getBounds());
  }
  @Override
  public void update(Graphics g)
  {
    paint(g);
  }
};
w.setAlwaysOnTop(true);
w.setBounds(w.getGraphicsConfiguration().getBounds());
w.setVisible(true);

不去上班。可能使用依赖于平台的JNI。但没有纯Java方式;这是肯定的。Thx回复:)我还没有安装Java7。。当我尝试使用Java6时,我有一个完全黑色的背景。无论如何,要为Java 6设置透明背景吗?@Holger你能为我指出什么是透明的吗?我知道它可以工作,但我不知道为什么它的行为是透明的。这个窗口与JFrame有什么不同?首先,您可以使用
com.sun.awt.AWTUtilities.setWindow不透明(w,false)
。只需在
setVisible(true)之前调用它
@Tomas Bisciak:区别不在于
窗口
<代码>w.setBackground(新颜色(0,真))
安装alpha通道值为
0
的背景色。如果您在使其透明之前说
setUndercorated(true)
,那么它也可以与
帧一起工作。但是我在这里使用了一个
窗口
,因此它不会显示在任务栏中。。点击透明在Mac上仍然不起作用。唉。