2014-02-06 14 views
6

Ich möchte eine Hilfsanwendung in Java erstellen .. die sich wie folgt verhält: Wenn sie über eine globale Verknüpfung aufgerufen wird, kann sie Text auf dem Bildschirm zeichnen (nicht in einem eigenen Anwendungsfenster, sondern über der Bildschirm). Ein ähnlicher Artikel ist here, aber ich möchte dies in Java erreichen.Zeichnen über Bildschirm in Java

Wenn ich etwas wie "Java Draw Over Screen" suche, kann ich nur viele Tutorials über Java2D bekommen.

Ich möchte überprüfen: 1) ist es möglich, über andere Anwendungen in Java zu zeichnen? 2) Wenn nicht möglich, gibt es Alternativen in Mac/Ubuntu?

Vielen Dank.

(Randbemerkung:. Ich weiß, dass Java nicht über die globale Verknüpfung Unterstützung, die ich andere Methoden bin versucht, dieses Problem zu lösen, nicht im Zusammenhang hier)

+0

Nicht zur Arbeit gehen. Vielleicht mit plattformabhängigem JNI. Aber keine reine Java-Art; das ist sicher. –

Antwort

13

einfach ein transparentes Fenster über den Bildschirm legen und ziehen darauf. Transparente Fenster unterstützen sogar Click-Through, so dass der Effekt so aussieht, als würden Sie direkt über den Bildschirm zeichnen.

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

Wenn pro Pixel Transluzenz nicht unterstützt wird oder sie nicht das Klick-Verhalten auf Ihrem System, können Sie pro Pixel versuchen Transparenz durch eine Fenstereinstellung Shape stattdessen:

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

Thx für die Antwort :) Ich habe Java7 noch nicht installiert .. als ich mit Java6 versuchte, habe ich einen völlig schwarzen Hintergrund. Wie auch immer, um einen transparenten Hintergrund für Java 6 zu setzen? – songyy

+0

@Holger Kannst du mir bitte aufzeigen, was das transparent macht? Ich weiß, dass es funktioniert keine Ahnung, warum es sich transparent verhalten. Wie ist dieses * Fenster * anders als etwas wie JFrame? –

+0

Beginnend mit [Java SE 6 Update 10] (http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10) können Sie 'com.sun.awt.AWTUtilities.setWindowOpaque (w , falsch) '. Ruf es einfach vor 'setVisible (true);' – Holger