3

アプリケーションの位置を保存するには、JFrame の場所を取得する必要があります。しかし、問題は getLocationOnScreen() が間違った結果を返すことです。または、少なくともそう思われます。

public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setMinimumSize(new Dimension(200, 200));
    frame.setVisible(true);

    frame.setLocation(100, 100);

    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            Point point = frame.getLocationOnScreen();
            System.out.println(point);
        }
    });
}

私の意見では、上記のコードは (100, 100) を生成する必要がありますが、代わりに "java.awt.Point[x=101,y=128]" を出力します。

正しい (100, 100) 結果を得るにはどうすればよいですか?

UPD: また、(100, 100) または (101, 128) になることもあります。そして、私はその論理を本当に理解できません。

UPD: このコードの 2 つの異なる実行。 ここに画像の説明を入力

4

1 に答える 1

3

setLocation は親に基づいて x、y に移動し、getLocationOnScreen は画面に基づいて位置を取得します...

getLocation と getLocationOnScreen が同じであるという保証はありません.. getLocation は「相対」ですが、 getLocationOnScreen は絶対です。

http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#getLocationOnScreen() http://docs.oracle.com/javase/7/docs/api/java/awt /Component.html#getLocation() http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#setLocation(int , int)

これはあなたのコードに対する私の出力です:

java.awt.Point[x=100,y=100]

どのJavaバージョンを使用していますか? 私のは 1.7.0_25 です。一番上のコンポーネントが画面の親として「必要」であるため、JFrame のデフォルトの動作に違いがある可能性があります。

Update from comments:
java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) Server VM (build 23.25-b01, mixed mode) Ubuntu 12.04

100,100 の場合もあれば、101,128 の場合もあります。

JFrame.setLocation JFrame.getLocationOnScreen のさまざまな動作 Windows では、この特定のケースでは常に 100, 100 を取得します。

于 2013-09-28T20:39:06.220 に答える