SWT Absolute position einer Composite/Control

Status
Nicht offen für weitere Antworten.

lumo

Top Contributor
Hallo

Habe die funktion Composite.getLocation() verwendet, bekomme allerdings die relative position zurück.
ergo die position vom parent etc wird nicht einrerechnet...

muss ich das nun rekursiv abfragen, bis ich bei der shell bin? oder gibts da eine schönere lösung?

SF hat mich nicht weit gebracht, ausser dass 2005 ein anderer user das selbe problem hatte, aber die lösung gefunden hat (und nicht gepostet hat :) )

danke schon mal

lumo
 
Zuletzt bearbeitet:

lumo

Top Contributor
habe jetzt eine lösung gefunden (meiner meinung aber DIRTY)
bin mir recht sicher dass es da irgendwo ne schöne lösung gibt:

problem window-decoration (also die höhe und breite der decoration von nem fenster)
hardcoded:
Java:
public class Windows {
	private static Dimension DEFAULT = new Dimension(8, 30);
	private static Dimension Vista = new Dimension(8, 30);
	private static Dimension XP = new Dimension(5, 30);

	public static Dimension getDecorationSize() {
		String OsName = System.getProperty("os.name").toLowerCase();
		if (OsName.contains("vista")) {
			return Vista;
		} else if (OsName.contains("xp")) {
			return XP;
		}
		else {
			return DEFAULT;
		}
	}
}

das ist die vorbereitung für die funktion absolutePosition(Object component)
note: hatte ich vorher rekursiv, bin aber der meinung dass iterativ weniger speicher benötigt
Java:
private Point absolutePosition(Object element) {
		Dimension decorationSize = Windows.getDecorationSize();
		int absX = decorationSize.width;
		int absY = decorationSize.height;
		if (element instanceof Control) {
			absY += ((Control) element).getSize().y;
		}
		while (!(element instanceof Shell)) {
			if (element instanceof Control) {
				Control con = (Control) element;
				Point ownPos = con.getLocation();
				element = con.getParent();
				absX += ownPos.x;
				absY += ownPos.y;
			} else {
				System.out.println(element.getClass().getSimpleName());
			}
		}
		if (element instanceof Shell) {
			Shell sh = (Shell) element;
			absX += sh.getLocation().x;
			absY += sh.getLocation().y;
		}
		return new Point(absX, absY);
	}
}

hab das ganze auf Vista und XP getestet, mit den selben ergebnissen.
hab auch noch ein kleines Snippet
Java:
import java.awt.Dimension;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class ApplicationWithPopupWindow {

	protected Shell shell;

	 * Launch the application.
	public static void main(String[] args) {
		try {
			ApplicationWithPopupWindow window = new ApplicationWithPopupWindow();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	 * Open the window.
	public void open() {
		Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	 * Create contents of the window.
	protected void createContents() {
		shell = new Shell();
		shell.setLayout(new BorderLayout(0, 0));
		shell.setSize(450, 300);
		shell.setText("SWT Application");
		{
			Button btnClickToOpen = new Button(shell, SWT.NONE);
			btnClickToOpen.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.err.println("button pressed");
					PopupWindow popup = new PopupWindow(shell);
					Button btn = new Button(popup.getContentComposite(),
							SWT.NONE);
					btn.setText("Close this modal window");
					btn.addSelectionListener(new SelectionAdapter() {
						@Override
						public void widgetSelected(SelectionEvent e) {
							System.err.println();
							((Button) e.getSource()).getShell().close();
						}
					});
					popup.openBelow(e.getSource());
				}
			});
			btnClickToOpen.setLayoutData(BorderLayout.CENTER);
			btnClickToOpen.setText("click to open a modal window");
		}

	}

	private class PopupWindow {

		protected Shell popupShell;
		protected Composite contentComposite;

		public PopupWindow(Shell parent) {
			//
			popupShell = new Shell(parent, SWT.RESIZE);
			popupShell.addShellListener(new ShellListener() {

				@Override
				public void shellIconified(ShellEvent e) {
					// TODO Auto-generated method stub
				}

				@Override
				public void shellDeiconified(ShellEvent e) {
					// TODO Auto-generated method stub
				}

				@Override
				public void shellDeactivated(ShellEvent e) {
					// TODO Auto-generated method stub
					((Shell) e.getSource()).close();
				}

				@Override
				public void shellClosed(ShellEvent e) {
					// TODO Auto-generated method stub
				}

				@Override
				public void shellActivated(ShellEvent e) {
					// TODO Auto-generated method stub
				}
			});
			popupShell.setLayout(new BorderLayout(0, 0));
			popupShell.setSize(200, 300);
			contentComposite = new Composite(popupShell, SWT.NONE);
		}

		public final Composite getContentComposite() {
			return contentComposite;
		}

		public void open() {
			popupShell.open();
		}

		public void setLocation(Point location) {
			popupShell.setLocation(location);
		}

		public void openAtMousePosition() {
			popupShell.setLocation(MouseInfo.getPointerInfo().getLocation().x,
					MouseInfo.getPointerInfo().getLocation().y);
		}

		// FIXME check java-forum.org and or decoration stuff
		public void openBelow(Object element) {
			Point abs = absolutePosition(element);
			popupShell.setLocation(abs);
			popupShell.open();
			System.err.println("absolutePosition: " + abs.x + "/" + abs.y);
		}

		private Point absolutePosition(Object element) {
			Dimension decorationSize = Windows.getDecorationSize();
			int absX = decorationSize.width;
			int absY = decorationSize.height;
			if (element instanceof Control) {
				absY += ((Control) element).getSize().y;
			}
			while (!(element instanceof Shell)) {
				if (element instanceof Control) {
					Control con = (Control) element;
					Point ownPos = con.getLocation();
					element = con.getParent();
					absX += ownPos.x;
					absY += ownPos.y;
				} else {
					System.out.println(element.getClass().getSimpleName());
				}
			}
			if (element instanceof Shell) {
				Shell sh = (Shell) element;
				absX += sh.getLocation().x;
				absY += sh.getLocation().y;
			}
			return new Point(absX, absY);
		}
	}

	private static class Windows {
		private static final Dimension DEFAULT = new Dimension(8, 30);
		private static final Dimension Vista = new Dimension(8, 30);
		private static final Dimension XP = new Dimension(5, 30);

		public static Dimension getDecorationSize() {
			String OsName = System.getProperty("os.name").toLowerCase();
			if (OsName.contains("vista")) {
				return Vista;
			} else if (OsName.contains("xp")) {
				return XP;
			} else {
				return DEFAULT;
			}
		}
	}
}
 

FatFire

Bekanntes Mitglied
Achja, ich Trottelchen, hab ich nicht drauf geachtet, dass ja SWT daneben stand. Ja, ähm, also da kenn ich mich nicht so aus, aber ich denke, toDisplay ist die Funktion, die Du brauchst, wenn es stimmt, was hier steht.

Gruß FatFire
 

lumo

Top Contributor
huh, danke für den link, hatte die SF eigentlich verwendet, aber DAS hab ich nicht gefunden (ev. weil ich in SWT etc gesucht habe! danke für den hinweis)

so gehts natürlich jetzt viel schöner :)
.oO(warum ich da nen Point mitgeben muss... darum hatte ich die fkt aus der liste der möglichen ausgeschlossen...)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
G Absolute Position von Komponenten AWT, Swing, JavaFX & SWT 3
Ernesto95 JavaFX Absolute Positionierung und Skalierung AWT, Swing, JavaFX & SWT 1
V Absolute Postionierung AWT, Swing, JavaFX & SWT 4
C GridBagLayout - absolute Größe AWT, Swing, JavaFX & SWT 3
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
C JavaFX Window-Position AWT, Swing, JavaFX & SWT 3
E JavaFX Cursor-Position im ScrollPane AWT, Swing, JavaFX & SWT 0
J BorderPane Position AWT, Swing, JavaFX & SWT 3
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
T SWT Wie kriege ich die Position des Textfeldes raus? AWT, Swing, JavaFX & SWT 19
C LayoutManager JFrame größe und ausrichtung + Position von Fensterelementen AWT, Swing, JavaFX & SWT 2
B Popup auf der Textcoursor-Position AWT, Swing, JavaFX & SWT 5
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
0 Swing JTextField - Position ? AWT, Swing, JavaFX & SWT 2
E Swing Objekt zu Position (Point) bewegen AWT, Swing, JavaFX & SWT 2
C Label wird nicht an der richtigen Position angezeigt.. AWT, Swing, JavaFX & SWT 7
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
M Jtable - wie position einer Celle bestimmen bei Multiselect AWT, Swing, JavaFX & SWT 4
B MessageBox Position Verändern AWT, Swing, JavaFX & SWT 8
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
B Position in einem Bild ermitteln AWT, Swing, JavaFX & SWT 3
B [ERLEDIGT]gui problem(genaue position von buttons ect.) AWT, Swing, JavaFX & SWT 9
M Position eines JLabels mit getX() auslesen AWT, Swing, JavaFX & SWT 2
M Position eines JLabels speichern? AWT, Swing, JavaFX & SWT 3
D Swing PopupMenu immer an gewünschte Position? AWT, Swing, JavaFX & SWT 2
W Swing Bild zeichnen wenn Maus an bestimmter Position ist AWT, Swing, JavaFX & SWT 4
R Swing GlazedLists UND Problem mit der Position des Cursors AWT, Swing, JavaFX & SWT 2
M 3D-Grafik Probleme mit Position der ViewPlatform AWT, Swing, JavaFX & SWT 4
C Caret Position mit X-Y-Koordinaten ermitteln AWT, Swing, JavaFX & SWT 2
J Swing Problem - Abspeichern JSplitPane Position AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
V Position der JScrollBar ändern AWT, Swing, JavaFX & SWT 5
T Z-Position der ViewPlatform? AWT, Swing, JavaFX & SWT 3
N Swing JTextArea/JScrollpane: JScrollbar position AWT, Swing, JavaFX & SWT 8
B aktuelle Position des Fensters ermitteln AWT, Swing, JavaFX & SWT 3
sylo Position des Icons bei JMenuItem AWT, Swing, JavaFX & SWT 11
H Y-Position mit get-/setLocation() unter Linux/Enlightement16 inkonsistent AWT, Swing, JavaFX & SWT 3
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
E Swing JLabel ändert seine Position nach setText AWT, Swing, JavaFX & SWT 2
hdi SWT FileDialog wird an scheinbar beliebiger Position angezeigt AWT, Swing, JavaFX & SWT 2
K mehrere JTextFields - wie finde ich die Cursor-Position? AWT, Swing, JavaFX & SWT 5
ElViZ End-Position eines gezeichneten Strings ermitteln. AWT, Swing, JavaFX & SWT 2
H Swing Illegal component position! AWT, Swing, JavaFX & SWT 2
Pithecanthropus Swing JScrollBar-Position festlegen.. AWT, Swing, JavaFX & SWT 3
K Postion Y im Frame != Position Y ?? AWT, Swing, JavaFX & SWT 16
R Position einer Componente? AWT, Swing, JavaFX & SWT 9
A Label hat falsche Position AWT, Swing, JavaFX & SWT 4
M Scrollbar anpassen (Position) AWT, Swing, JavaFX & SWT 6
M GridBagLayout - Position immer zentriert AWT, Swing, JavaFX & SWT 5
J JSplitpane separator soll nicht seine Position veraendern? AWT, Swing, JavaFX & SWT 3
P JButton Position rausfinden beim GridBagLayout AWT, Swing, JavaFX & SWT 2
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
X Dynamische linien (Position und Länge) AWT, Swing, JavaFX & SWT 4
G position im FlowLayout AWT, Swing, JavaFX & SWT 11
B Thumbnail-Position per Mausklick ändern AWT, Swing, JavaFX & SWT 3
& Position eines Fensters nicht verändern AWT, Swing, JavaFX & SWT 8
A Position des Fensters verändern AWT, Swing, JavaFX & SWT 21
U JTable Position der Spalte abfragen AWT, Swing, JavaFX & SWT 7
D JInternalFrame iconified Position nach parent-resize AWT, Swing, JavaFX & SWT 2
U Problem mit JButton (Position & Größe) AWT, Swing, JavaFX & SWT 7
W Schnappen der Größe und Position AWT, Swing, JavaFX & SWT 7
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6
S Position eines Fensters festlegen AWT, Swing, JavaFX & SWT 2
L Menu Position verändern? AWT, Swing, JavaFX & SWT 24
P JPanel im BorderLayout feste Größe/Position zuordnen AWT, Swing, JavaFX & SWT 3
T jTable / Spaltenbreite und Position AWT, Swing, JavaFX & SWT 2
J InternalFrames Grösse Position AWT, Swing, JavaFX & SWT 3
vogella JScrollPane - Position setzen der Scrollbalken AWT, Swing, JavaFX & SWT 5
M JPanel Position tut nicht, was sie soll AWT, Swing, JavaFX & SWT 8
T jTable Colum feste position AWT, Swing, JavaFX & SWT 3
S Position von Labels, Buttons, etc. festsetzen und Scrollen AWT, Swing, JavaFX & SWT 4
M GridBagLayout - Component Position AWT, Swing, JavaFX & SWT 4
B Setzen von Position > 90 bei JScrollbar nicht möglich AWT, Swing, JavaFX & SWT 3
M Position im JTree veraendern AWT, Swing, JavaFX & SWT 3
A Position im Text bei Rechtsklick AWT, Swing, JavaFX & SWT 7
T JScrollPane Scrollbar-Position AWT, Swing, JavaFX & SWT 2
Y BasicArrowButton + Größe und Position AWT, Swing, JavaFX & SWT 7
K Mouse Position nach Drag und Drop? AWT, Swing, JavaFX & SWT 4
lin ?JDialog?-nur best. Grösse und Position AWT, Swing, JavaFX & SWT 2
B JLabel ändert seine Position AWT, Swing, JavaFX & SWT 7
M Position von Eingabe-Fenster AWT, Swing, JavaFX & SWT 5
R text offset versus JTextComponent caret position AWT, Swing, JavaFX & SWT 6
G Probleme mit der Position eines JPanels AWT, Swing, JavaFX & SWT 2
T Größe und Position eines JLabels ermitteln AWT, Swing, JavaFX & SWT 3
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben