【问题标题】:Drawing over screen in Java在 Java 中绘制屏幕
【发布时间】:2014-03-03 12:11:34
【问题描述】:

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

类似的帖子是here,但我想用Java实现。

当我搜索“java draw over screen”之类的内容时,我只能得到很多关于 Java2D 的教程。

我想检查:1) 是否可以在 Java 中绘制其他应用程序? 2) 如果不可能,Mac / Ubuntu 中是否有任何替代方案?

非常感谢。

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

【问题讨论】:

  • 不行。也许与平台相关的JNI。但是没有纯Java方式;这是肯定的。

标签: java drawing system


【解决方案1】:

只需在屏幕上放置一个透明窗口并在其上绘图。透明窗口甚至支持点击,效果就像是直接在屏幕上绘制一样。

使用 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);

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

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

【讨论】:

  • 谢谢回复 :) 我还没有安装 Java7.. 当我尝试使用 Java6 时,我的背景完全是黑色的。无论如何要为 Java 6 设置透明背景?
  • @Holger 你能告诉我什么是透明的吗?我知道它可以工作,但不知道它为什么表现得透明。这个 window 与 JFrame 有何不同?
  • Java SE 6 Update 10 开头可以使用com.sun.awt.AWTUtilities.setWindowOpaque(w, false)。只需在setVisible(true);之前调用它
  • @Tomas Bisciak:这不是 Window 的区别。 w.setBackground(new Color(0, true)); 安装 Alpha 通道值为 0 的背景颜色。如果您在使其透明之前说setUndecorated(true),它也可以与Frame 一起使用。但是我在这里使用了Window,所以它不会出现在任务栏中。
  • 我刚刚尝试使用 Oracle 的 Java 9 早期访问版本:JDK9 Build b51——不幸的是……点击透明性在 Mac 上仍然不起作用。叹息。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多