AWT Bug in Component.getLocationOnScreen()

Ebenius

Top Contributor
Huhu liebes Forum,

kann mal bitte jemand der ein Windows oder einen Mäc zur Hand hat diesen Quelltext kompilieren und bei sich probieren?
Java:
/* (@)LocationOnScreenBugFun.java */

/* Copyright 2012 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Window;
import java.awt.event.ActionEvent;

import javax.swing.*;

/**
 * Demonstrates how location and locationOnScreen work differently on my
 * Ubuntu 11.10 with Java 1.6.0_26-b03.
 * 
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 */
public class LocationOnScreenBugFun {

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new JButton(new AbstractAction("Relocate") {

      private static final long serialVersionUID = 1L;

      public void actionPerformed(ActionEvent e) {
        final Component button = (Component) e.getSource();
        final Window w = SwingUtilities.getWindowAncestor(button);
        System.out.printf("Old location:   %s%n ... on screen: %s%n",
              w.getLocation(), w.getLocationOnScreen());
        final int screenWidth = w.getToolkit().getScreenSize().width;
        w.setLocation(screenWidth - w.getWidth(), 0);
        System.out.printf("New location:   %s%n ... on screen: %s%n",
              w.getLocation(), w.getLocationOnScreen());
      }
    }));

    final JFrame f = new JFrame("Test Frame: LocationOnScreenBugFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocation(0, 0);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}

Bei mir gibt das Programm beim Druck auf den Knopf das aus:
Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=3740,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
Bei Euch auch?

Das Problem führt bei mir reproduzierbar dazu, dass [c]childDialog.setLocationRelativeTo(parentFrame)[/c] nicht richtig funktioniert, wenn das [c]parentFrame[/c] zuvor geändert wurde. Erst wenn die EventQueue zwischen der Änderung der Location des [c]parentFrame[/c]s und dem [c]childDialog.setLocationRelativeTo(parentFrame)[/c] Events abarbeiten konnte, funktioniert das. Mit anderen Worten, das funktioniert nicht richtig :noe::
Java:
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    parentFrame.setLocation(newLocation)
    childDialog.setLocationRelativeTo(parentFrame);
  }
});
Aber das funktioniert :bahnhof::
Java:
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    parentFrame.setLocation(newLocation)
  }
});
// The EventQueue now processes all pending events before setLocationRelativeTo() is called
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    childDialog.setLocationRelativeTo(parentFrame);
  }
});

Ebenius
 

jgh

Top Contributor
ne, bei mir spuckt er das erwartete Ergebnis aus: (win7)

Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=1788,y=0]
 ... on screen: java.awt.Point[x=1788,y=0]

du hast auch 2 Monitore angeschlossen...oder?
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
ne, bei mir spuckt er das erwartete Ergebnis aus: (win7)
[…]
du hast auch 2 Monitore angeschlossen...oder?
Ich hatte es schon befürchtet. Ja, ich hab zwei Monitore. Aber auch mit nur einem:
Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=1818,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
Danke sehr.

Hat noch jemand nen Mac?

Ebenius
 

Andi_CH

Top Contributor
Win7, 2 Monitore

Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=1796,y=0]
 ... on screen: java.awt.Point[x=1796,y=0]

Linux (Debian), Laptop ohne zusätzlicher Monitor:
Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=1296,y=0]
 ... on screen: java.awt.Point[x=0,y=0]

hth
 

Gossi

Bekanntes Mitglied
Code:
Old location:   java.awt.Point[x=0,y=0]
 ... on screen: java.awt.Point[x=0,y=0]
New location:   java.awt.Point[x=1797,y=0]
 ... on screen: java.awt.Point[x=1797,y=0]

Allerdings weit ausm Fenster raus ^^
 
G

Gast2

Gast
Hi,
ich weiß nicht obs dir hilft, aber wenn ich den Code wie folgt abändere funktionierts bei mir wie erwartet:
Java:
        w.setLocation(screenWidth - w.getWidth(), 0);
        w.setVisible(false);
        w.setVisible(true);

Code:
Old location:   java.awt.Point[x=57,y=24]
 ... on screen: java.awt.Point[x=57,y=24]
New location:   java.awt.Point[x=3742,y=0]
 ... on screen: java.awt.Point[x=3742,y=24]

Ubuntu 11.10 mitm OpenJDK 6.

EDIT:
Nein, das war nicht ganz richtig. So funktionierts auch nur sehr selten, war grad wohl nur Zufall ;)
Aber so funktionierts zuverlässig:
Java:
w.setLocation(screenWidth - w.getWidth(), 0);
try { Thread.sleep(50); } catch (InterruptedException e1) { }
Aber ob das so soll?
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
M Swing Component Resize AWT, Swing, JavaFX & SWT 7
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
W Swing Component mehrfach adden AWT, Swing, JavaFX & SWT 0
H Drag component out of window AWT, Swing, JavaFX & SWT 1
A remove(Component) funktioniert nicht; JTable AWT, Swing, JavaFX & SWT 4
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
B JTable Component mit String? AWT, Swing, JavaFX & SWT 4
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
H Component Zerren AWT, Swing, JavaFX & SWT 5
S Swing Component vertikal und hochizontal zentrieren? AWT, Swing, JavaFX & SWT 5
Z Component für File-Browser ähnliche Oberfläche AWT, Swing, JavaFX & SWT 6
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
C Problem mit remove(Component comp) AWT, Swing, JavaFX & SWT 23
F AWT Component in OpenGL anzeigen? AWT, Swing, JavaFX & SWT 18
A Java Konsolen Component AWT, Swing, JavaFX & SWT 6
G Swing Component.toString() was bedeutet flags AWT, Swing, JavaFX & SWT 8
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
DamienX Swing Component auf mehreren Containern AWT, Swing, JavaFX & SWT 2
algorismi AWT Tranparente heavyweight component AWT, Swing, JavaFX & SWT 2
R Swing Methode add([Component]) funzt nich AWT, Swing, JavaFX & SWT 7
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
U LayoutManager [GBL] Component aus einer Zelle löschen AWT, Swing, JavaFX & SWT 2
H Swing Illegal component position! AWT, Swing, JavaFX & SWT 2
C Flamingo Component AWT, Swing, JavaFX & SWT 2
M Doppelklick auf Component abfangen AWT, Swing, JavaFX & SWT 5
P DragAndDrop zw Component und Container AWT, Swing, JavaFX & SWT 4
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
R Zugriff auf Component um addComponentListener() aufzurufen AWT, Swing, JavaFX & SWT 4
K AWT/SWING intern - Wie funktioniert die Component-Ermittlung AWT, Swing, JavaFX & SWT 13
S Line Component in SWING AWT, Swing, JavaFX & SWT 2
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
C Syntax Highlighting Component AWT, Swing, JavaFX & SWT 2
O KeyBoardFocusManager - previous und next Component checken? AWT, Swing, JavaFX & SWT 2
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
0 Component austauschen und aktualisieren ? AWT, Swing, JavaFX & SWT 6
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12
G "Rating Component" - Bewerten über JTable AWT, Swing, JavaFX & SWT 3
G Drag And Drop von Component (List, Tree) zum Desktop AWT, Swing, JavaFX & SWT 2
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
P Component ändern (repaint) AWT, Swing, JavaFX & SWT 9
F Probleme bei add(Component) JPanel > JFrame AWT, Swing, JavaFX & SWT 3
B Component AWT, Swing, JavaFX & SWT 5
L Swing Component in Buffered Image AWT, Swing, JavaFX & SWT 6
G Component "finden" AWT, Swing, JavaFX & SWT 6
H Component fokussierbar machen AWT, Swing, JavaFX & SWT 2
P Wie das Component Object des Hauptfensters ermitteln? AWT, Swing, JavaFX & SWT 4
M GridBagLayout - Component Position AWT, Swing, JavaFX & SWT 4
R Component einer Form herausbekommen AWT, Swing, JavaFX & SWT 3
T JMenu/JMenuItem Component auf der geaddet wurde AWT, Swing, JavaFX & SWT 16
B Component in JSplitPane aktualisieren AWT, Swing, JavaFX & SWT 2
G add(Component) in paintComponent erlaubt ? AWT, Swing, JavaFX & SWT 2
K Component einfügen in JPane AWT, Swing, JavaFX & SWT 5
M getSize von Component und ModelListener AWT, Swing, JavaFX & SWT 2
S Component auf Label zeichnen? AWT, Swing, JavaFX & SWT 3
R convertPointToScreen(Point p, Component c) AWT, Swing, JavaFX & SWT 5
R Component aus Container entfernen bzw. austauschen. AWT, Swing, JavaFX & SWT 6
C JPanel Component austauschen AWT, Swing, JavaFX & SWT 4
pinerski Swing Jtable und getLocationOnScreen einer selectedRow AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben