Screenshot vom Bereich behind dem aktuellen Fenster machen

Status
Nicht offen für weitere Antworten.

Steev

Bekanntes Mitglied
Hallo liebe Forengemeinde.

Weil es in Java ja keine Transparenten Fenster gibt, ich aber ein Fenster machen muss das eine andere Form hat als Rechteckig habe ich bevor das Fenster angezeigt wird einen Screenshot gemacht und den als Hintergrund für das Fenster genommen. Das sieht auch ganz gut aus solange man nicht auf die Idee kommt das Fenster zu verschieben. Dann stimmt das nicht mehr. Weil das suboptimal ist möchte ich nun immer einen Screenshot von dem Bereich machen auf dem das Fenster gezeichnet werden soll und ihn als hintergrund für das Fenster nehmen.

Leider ist das schwerer als ich dachte.

Ich hoffe mir kann jemand helfen.
 

Wildcard

Top Contributor
Steev hat gesagt.:
Weil es in Java ja keine Transparenten Fenster gibt, ich aber ein Fenster machen muss das eine andere Form hat als Rechteckig
Das stimmt nicht. Es ist derzeit mit Swing und AWT nicht möglich. Andere Toolkits haben auch andere Möglichkeiten.
Das Screenshot Gehampel solltest du dir in jedem Fall sparen, das wird nichts.
Entweder du nimmst ein rechteckiges Fenster, oder ein anderes Toolkit (zB SWT).
 

The_S

Top Contributor
richtig! Die Screenshot-Methode ist mehr als fehleranfällig. Selbst wenn du alles hinbekommen solltest, was machst du, wenn sich im "transparenten" Bereich deines Fensters im Hintergrund eine Animation abspielt? Spätestens hier stößt du an die Grenzen dieser Methode.
 

L-ectron-X

Gesperrter Benutzer
[off topic]
@Steev: Hattest du Probleme mit der Spamprüfung beim Wort "hinter"?
Mir ist erst gestern aufgefallen, dass jemand das Wort aus seinem Titel "ausgebaut" hat.
Das Script ist noch nicht ganz in Ordnung, daher wäre es interessant zu wissen, ob du Schwierigkeiten hattest.

[/off topic]
 

Jango

Gesperrter Benutzer
Andere Alternative:

Wenn es ein reines Windowsprogramm werden soll, schreib es in C# - da gibt es transparente Fenster.
 

Steev

Bekanntes Mitglied
PS: Das Programm soll Plattformunabhängig sein. C# und C++ kenne ich. Schicke Sache! Aber ich will nunmal Java.
 

Steev

Bekanntes Mitglied
Phu, ich habe mir dieses SWT mal runtergeladen.
Das ist ja ein Murks bis man da endlich ein Fenster gebaut hat.
Ich glaube ich muss mich erst einmal in die neuen Komponenten einarbeiten weil bei SWT ja wirklich alles anders ist als bei AWT oder Swing.
Ich glaube ich mache das ohne Transparenz und in Swing.
:(

Gibt es kein kleines Programm das man per exec aufrufen kann und das eine bestimmte Farbe im Fenster transparent macht oder so?
 

Steev

Bekanntes Mitglied
Ich denke an ein Programm das in C oder C++ oder C# etc. geschrieben worden ist.

Ich habe mal so eins gesehen das alle Fenster zu 80 % durchsichtig macht. Es gibt da doch sicher eine Möglichkeit, dass man einem solchen Programm als Parameter den Programmnamen übergibt oder so.
 

Wildcard

Top Contributor
Ein nicht rechteckiges Fenster:
http://dev.eclipse.org/viewcvs/inde.../src/org/eclipse/swt/snippets/Snippet134.java
Code:
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

public class Snippet134 {

static int[] circle(int r, int offsetX, int offsetY) {
	int[] polygon = new int[8 * r + 4];
	//x^2 + y^2 = r^2
	for (int i = 0; i < 2 * r + 1; i++) {
		int x = i - r;
		int y = (int)Math.sqrt(r*r - x*x);
		polygon[2*i] = offsetX + x;
		polygon[2*i+1] = offsetY + y;
		polygon[8*r - 2*i - 2] = offsetX + x;
		polygon[8*r - 2*i - 1] = offsetY - y;
	}
	return polygon;
}

public static void main(String[] args) {
	final Display display = new Display();
	//Shell must be created with style SWT.NO_TRIM
	final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
	shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
	//define a region that looks like a key hole
	Region region = new Region();
	region.add(circle(67, 67, 67));
	region.subtract(circle(20, 67, 50));
	region.subtract(new int[]{67, 50, 55, 105, 79, 105});
	//define the shape of the shell using setRegion
	shell.setRegion(region);
	Rectangle size = region.getBounds();
	shell.setSize(size.width, size.height);
	//add ability to move shell around
	Listener l = new Listener() {
		Point origin;
		public void handleEvent(Event e) {
			switch (e.type) {
				case SWT.MouseDown:
					origin = new Point(e.x, e.y);
					break;
				case SWT.MouseUp:
					origin = null;
					break;
				case SWT.MouseMove:
					if (origin != null) {
						Point p = display.map(shell, null, e.x, e.y);
						shell.setLocation(p.x - origin.x, p.y - origin.y);
					}
					break;
			}
		}
	};
	shell.addListener(SWT.MouseDown, l);
	shell.addListener(SWT.MouseUp, l);
	shell.addListener(SWT.MouseMove, l);
	//add ability to close shell
	Button b = new Button(shell, SWT.PUSH);
	b.setBackground(shell.getBackground());
	b.setText("close");
	b.pack();
	b.setLocation(10, 68);
	b.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event e) {
			shell.close();
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	region.dispose();
	display.dispose();
}
}
 

The_S

Top Contributor
Dexpot kann das z. B. (auch wenn das damit dann ein bisschen zweckentfremdet wird ;) ). Aber ob man damit auch teilbereiche transparent bekommt ... kA
 

Steev

Bekanntes Mitglied
Danke für eure Antworten,
ich werde den Code mal ausprobieren.

@Hobbit:
Dexpot habe ich noch nie gehört. Ich suche mal danach. Zur Zeit habe ich keine Zeit mich in SWT reinzuarbeiten. Wir machen alles mit Swing... Da kann so ein Programm von nutzen sein.
Ich google mal.
[edit:] Gufunden! Mal sehen...

Danke vorerst
 

Steev

Bekanntes Mitglied
@Wildcard:
Dankeschön, das war genau das was ich gebraucht habe.
Ich denke ich fange doch mal mit SWT an.

@Hobbit:
Nettes Tool.
 

Steev

Bekanntes Mitglied
Kleine Frage nochmal,
ich habe es hinbekommen mit SWT ein rundes Fenster zu machen. Kann man mit SWT auch durchsichtige Fenster machen?

Also ein Fenster durch das man den Hintergrund etwas sieht (s.B. zu 50%)
 

Wildcard

Top Contributor
Nur so:
Code:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Snippet180 {

public static void main(String[] args) {
	Display display = new Display();
	final Image image = display.getSystemImage(SWT.ICON_WARNING);
	//Shell must be created with style SWT.NO_TRIM
	final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
	shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
	//define a region 
	Region region = new Region();
	Rectangle pixel = new Rectangle(0, 0, 1, 1);
	for (int y = 0; y < 200; y+=2) {
			for (int x = 0; x < 200; x+=2) {
				pixel.x = x;
				pixel.y = y;
				region.add(pixel);
			}
		}
	//define the shape of the shell using setRegion
	shell.setRegion(region);
	Rectangle size = region.getBounds();
	shell.setSize(size.width, size.height);
	shell.addPaintListener(new PaintListener() {
		public void paintControl(PaintEvent e) {
			Rectangle bounds = image.getBounds();
			Point size = shell.getSize();
			e.gc.drawImage(image, 0, 0, bounds.width, bounds.height, 10, 10, size.x-20, size.y-20);
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	region.dispose();
	display.dispose();
}
}
 

JBenutzername

Aktives Mitglied
Transparente und nicht-rechteckige Fenster kann man auch mit Swing sehr einfach umsetzen, wenn man dazu JNA (https://jna.dev.java.net/) benutzt. In einem Beispiel-Package gibt es die Klasse WindowUtil die das kann (Windows, Linux, Mac OS).

Beispiel für Transparenz:
Code:
JFrame f = new JFrame();
...
WindowUtils.setWindowAlpha(f, 0.5f);
f.setVisible(true);
 

Wildcard

Top Contributor
JBenutzername hat gesagt.:
In einem Beispiel-Package gibt es die Klasse WindowUtil die das kann (Windows, Linux, Mac OS).
Die meisten (bodenständigen) Windows Manager von Linux und meines Wissens auch Mac OS (auch wenn es transparenzeffekte hat) unterstützen doch gar keine transparenten Fenster
 

Steev

Bekanntes Mitglied
Hey, super. Dann kann ich doch Swing benutzen. SWT finde ich nämlich irgendwie schrecklich ^^

Dankeschön.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Screenshot -Bereich auswählen Allgemeine Java-Themen 2
T Methoden Farbe auf Screenshot suchen Allgemeine Java-Themen 2
F Screenshot auf bestimmtes Teilbild untersuchen Allgemeine Java-Themen 3
U Screenshot erstellen und speichern Allgemeine Java-Themen 6
K Screenshot mit Maus Allgemeine Java-Themen 2
Z Desktop anzeigen + Screenshot klappt nicht Allgemeine Java-Themen 3
F Screenshot von gewissen Anwendungen nicht möglich Allgemeine Java-Themen 5
Developer_X ScreenShot erstellen Allgemeine Java-Themen 8
J Screenshot von Websites? Allgemeine Java-Themen 3
P Screenshot in Java Allgemeine Java-Themen 53
G Screenshot mittels robot ausführen Allgemeine Java-Themen 4
MQue Screenshot Allgemeine Java-Themen 4
U Java Screenshot Alt+druck Allgemeine Java-Themen 3
T Screenshot ohne meinem Programm Allgemeine Java-Themen 5
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
N Wo kann man Java im automativen Bereich anwenden? Allgemeine Java-Themen 7
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
P Datum im gewünschten Bereich Allgemeine Java-Themen 21
V Klassen in "abgeschirmten Bereich" laden? Allgemeine Java-Themen 7
S JavaCC : SKIP Token nur für bestimmten Bereich ?? Allgemeine Java-Themen 2
J Batik zoom in gewählten Bereich Allgemeine Java-Themen 2
K Exception-Bereich Allgemeine Java-Themen 3
X Langsames Java im Bereich der GUI-Programmierung Allgemeine Java-Themen 8
T indexOf => bestimmter Bereich Allgemeine Java-Themen 26
A Suche Beratung im Bereich Java Threads. Allgemeine Java-Themen 3
N Zufallszahlen in einem gegebenen Bereich erzeugen Allgemeine Java-Themen 9

Ähnliche Java Themen


Oben