An beliebige Stelle des Bildschirms zeichnen

boehmi

Mitglied
Hi Leute,

ich möchte eine Anwendung schreiben, mit der ich auf meinem Bildschirm malen kann, aber ohne dass dabei die Fenster im Hintergrund versteckt werden, oder einfach nur ein Screenshot gemacht wird.
Das heißt, der Javaframe soll entweder minimiert sein, oder unsichtbar, oder etwas vergleichbares.

Zunächst dachte ich ich kann es mit einem maximierten 100% transparenten Fenster und irgendeiner Art von Canvas lösen, aber leider scheint das mit Java6 noch nicht so richtig zu klappen:
http://www.java-forum.org/awt-swing-swt/103355-awtutilities-access-restriction.html

Meint ihr das ist in Java überhaupt machtbar und wenn ja, wie? ;)

Danke im voraus
 

boehmi

Mitglied
Okay... ich hab kein Problem damit C++ zu nehmen.
Hast du einen Link, Source oder Stichwort nach dem ich weiter suchen kann?

Danke

Grüße
 

Kr0e

Gesperrter Benutzer
Keinen Link aber ich sag dir, wie es etwa geht:

Bei C++ musst du mit der WinAPI arbeiten, um bei der WinAPI iwas zu zeichnen brauchst
du sogenannte Handles. Ganz stumpf jetzt:

Das Handle des Desktops ist "0". Wenn du dir einen Grafikkontext mit Hwnd=0 erstellen lässt,
kannst du machen was du willst auf dem Desktop...

Denk dran, dass der Desktop ab und zu neugezeichnet wird. Darauf musst du entsprechend reagieren und ggf.
deinen Text oder was auch immer erneut painten.

Gruß,

Chris
 

boehmi

Mitglied
Male ich denn damit auch über andere Fenster oder nur auf dem Desktop-Fenster?

Auch wenns das jetz nich mehr ins Javaforum gehört ;)
 

Kr0e

Gesperrter Benutzer
Damit malst du eiskalt über alles drüber was es gibt. C++ an die Macht :p!

Jedes Progamm wird wohl nur als Childwindow vom Desktop gewertet...
 
T

Tomate_Salat

Gast
"Davon abgesehen ist das C und nicht C++ ... "

unnötiger kommentar

Naja, wenn ich an die letzten Posts von Bierhumpen denke....war da nie ein sinnvoller dabei. Meine C/C++-Kenntnisse sind nicht gerade die besten, aber ich finde es doch schon interessant, wie er von der Theorie komplett auf C schließt x). Soweit ich weis ist das mit C++ ebendso lösbar.

Naja, es kann doch vieles geben was einen repaint auslöst, ich denke mal:
  • Programmstart
  • Ordner öffnen/verschieben
  • Programme verschieben
  • F5 drücken
  • Startleiste öffnen
  • Fehlermeldungen

... wie gesagt, meine Kenntnisse in C/C++ sind nicht die besten, aber bevor wir hier jz alle fälle aufzählen, da gibts doch hoffentl. einen repaintListener oder sowas :p

MFG

Tomate_Salat
 

Kr0e

Gesperrter Benutzer
hi!

Ja, oder man zeichnet alle 30 ms mit einem timer z.b. Wäre glaub cih das einfacshte. Verbraucht jetzt nicht soooo die Megaresourcen... Bierhumpen hat zwar recht, dass die WinAPI mit C geschrieben ist und nicht mit C++.

Aber zu sagen, dass ist C und nicht C++ ist genauso unsinnig wie das Java6 und nicht Java5. Mit Java6 kann man alles machen, was mit Java5 möglich war. und mit c++ kann mann ALLES machen was mit C möglich ist und eben noch MEHR.

Hätte es den C++ Standard damals schon gegeben, wäre auch die WinAPI in C++ geschrieben.


@Tomaten_Salat:
RepaintListener beim Desktop registrieren ist ne gute Idee. Müsste ja machbar sein, da wir ja das Handle kennen. (0 eben)
 
T

Tomate_Salat

Gast
naja, alle 30ms einen repaint auszulösen, ist eine Möglichkeit, aber wenn es einen listener gibt, würde ich doch eher diese vorziehen. Sonst klingt das eher nach Plan B ^^.
 
M

maki

Gast
Bitte freundlich bleiben, Blödsinn wird hier von allen Seiten geschrieben(speziell was C/C++ und die Win32 API betrifft, Petzold hilft, MFC übrigens auch), das hilft weder dem TS noch dem Forum, bei Interesse kann man ja einen eigenen Thread dafür aufmachen, wobei sich mir der Sinn aber nicht erschliesst hier über C/C++ und die Win32 API zu diskutieren.

Da die Antworten weg von Java und hin zu irgendetwas anderem gehen verschiebe ich mal.
 

Runtime

Top Contributor
Man kann ein JFrame oder ein JDialog machen und es mit AWTUtilities transparent machen. Dann noch always on top auf true setzen. Alles was auf diesem Fenster gezeichnet wird, ist dann auf dem Bildschirm sichtbar.
 
T

Tomate_Salat

Gast
Wäre schön wenn es so ginge, aber meiner Erfahrung nach, haben die Componenten auf dem JFrame die gleiche Transparentz. Wenn du weist wie man das umgehen kann, bitte posten, würde mich interessieren.
 

Kr0e

Gesperrter Benutzer
Bedeutet denn Transparenz, dass man dahinter liegende Programme "Anklicken" kann ? Ich wäre mir da nicht sicher,
habs aber uach ncoh nciht ausprobiert. ICh meine is ja cool, dass man sowas was anzeigen lassen kann, aber wenn dann alle Programme quasi inaktiv sind, da sie ja hinter dem ersten Frame liegen, bringt das ja nicht soo viel.


Gruß,

Chris
 

Runtime

Top Contributor
@ Tomate Salat:
Wenn man setWindowOpacity aufruft, ist alles weg, wenn man es aber mit setWindowOpaque macht, ist nur der Hintergrund weg.
@ kr0e:
Ich versteh nicht was du meinst.
 

Kr0e

Gesperrter Benutzer
Naja, du willst doch "auf den Desktop" zeichnen, in dem du ein ganz normales Fesnter nimmst, es transparent machst und dann darauf zeichnest und AlwaysOnTop auf true setzt. Meine Frage war: Können dann Programm die dahinter sind (z.b. ein Explorerfenster) angeklickt werden ? bzw können programme überhaupt noch benutzt werden ? Denn wenn das immer OnTop ist, hat ja uach dieses Windows den Focus...
 

Runtime

Top Contributor
Wenn man ein Fenster auf alwaysOnTop setzt, ist es immer oben, hat aber nicht immer den Fokus. (Unter Windows jedenfalls, ich weiss nicht wie es auf Mac ist.) Wenn man neben die Stellen, auf denen gezeichnet wurden, klickt, kann alles dahinter noch benutzt werden.
 
T

Tomate_Salat

Gast
Java:
final JFrame frame			= new JFrame("test");
		
		AWTUtilities.setWindowOpaque(frame, true);
		AWTUtilities.setWindowOpacity(frame, 0.4F);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel			= new JPanel();
		panel.setLayout(null);
		
		JButton button			= new JButton("hallo");
		button.setLocation(10, 10);
		button.setSize(100, 20);
		
		panel.add(button);
		frame.add(panel);
		frame.setSize(300, 300);

		SwingUtilities.invokeLater(new Runnable()
		{
			@Override
			public void run()
			{
				frame.setVisible(true);
			}
		});
macht bei mir trotzdme alles transparent :-/
 

Runtime

Top Contributor
Du musst setOpaque false setzen, nicht true. Diesen Fehler mache ich auch immer. :D Und wahrscheinlich solltest du alles direkt auf das Fenster adden, nicht zuerst auf ein JPanel. Leider
ist AWTUtilities in kuenftigen Versionen nicht mehr verfuegbar.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Schreib mal ein KSKB bitte, bei mir funktioniert das komplett nicht wie es deiner Meinung nach gehn sollte.
 

Runtime

Top Contributor
Java:
import com.sun.awt.AWTUtilities;
import javax.swing.JFrame;

public class KSKB {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setAlwaysOnTop(true);
        frame.setLayout(null);
        frame.setSize(500, 500);
        frame.setUndecorated(true);
        JButton button = new JButton("blabla");
        button.setBounds(100, 100, 100, 50);
        frame.add(button);
        AWTUtilities.setWindowOpaque(frame, false);
        frame.setVisible(true);
    }

}
Das sollte funktionieren. :)
 
T

Tomate_Salat

Gast
Interessant. Selten so glücklich mich geirrt zu haben.

Edit+Spielerei:
Hier ein kleine KSKB wie das mit dem Zeichnen aussehen könnte :)

Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import com.sun.awt.AWTUtilities;
 
public class KSKB {
 
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setAlwaysOnTop(true);
        frame.setLayout(null);
        frame.setSize(500, 500);
        frame.setUndecorated(true);
        JPanel panel	= new JPanel()
        {
        	@Override
        	protected void paintComponent(Graphics g)
        	{
        		Graphics2D g2d	= (Graphics2D) g.create();
        		
        		BasicStroke bs	= new BasicStroke(5.F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL);        		
        		
        		g2d.setStroke(bs);
        		
        		g2d.setColor(Color.BLUE);
        		g2d.drawLine(0, 0, 100, 100);
        		g2d.drawLine(100, 100, 200, 50);
        		g2d.dispose();
        	}
        };        
        panel.setBounds(100, 100, 200, 200);
        frame.add(panel);
        AWTUtilities.setWindowOpaque(frame, false);
        SwingUtilities.invokeLater(new Runnable()
		{
			
			@Override
			public void run()
			{
				frame.setVisible(true);
			}
		});        
    }
 
}
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
A Swing Suche Listener für beliebige Änderung an GUI Items/Controls AWT, Swing, JavaFX & SWT 8
J Fixes Layout auf beliebige Fenstergröße skalieren AWT, Swing, JavaFX & SWT 2
V Beliebige Komponenten in einem JPopupMenu? AWT, Swing, JavaFX & SWT 3
G Beliebige Klasse als Ereignisquelle AWT, Swing, JavaFX & SWT 4
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
G Bild an vorgegebene stelle im Fenster stzen AWT, Swing, JavaFX & SWT 18
T Boolean an beliebiger Stelle in Tabelle AWT, Swing, JavaFX & SWT 13
D JTextField an bestimmter Stelle setzen? AWT, Swing, JavaFX & SWT 6
G JComboBox mit leerzeichen an erster stelle AWT, Swing, JavaFX & SWT 13
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
O Vollbild des Bildschirms AWT, Swing, JavaFX & SWT 1
C Auflösung des Bildschirms ändern AWT, Swing, JavaFX & SWT 2
T awt Framegröße an die größe des Bildschirms anpassen AWT, Swing, JavaFX & SWT 2
P JFrame/JWindow in der Mitte des Bildschirms positionieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben