2

JFrameLinux(およびここでは異なるウィンドウマネージャーの下)、Mac、およびWindowsでJavaウィンドウを常に同じ方法で表示する正しい方法は何ですか?

JFrameWindowsでは最大化されているため、実際にはいくつかの問題があります。JFrame素晴らしいWMを備えたLinux Notebookでは、ウィンドウはパックされているだけで、Macではウィンドウが半分最大化されているため、Linuxよりも大きくなります。パック...

画面をMaximiumサイズに設定しようとしました。これは、Windowsでは非常にうまく機能しているようですが、MacやLinux(Awesome WM)では機能しません。

これは非常に単純なフレームで、現在行っていることを説明しています。

import java.awt.Dimension;
import java.awt.Toolkit;

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

public class JFrameMaximize extends JFrame {
    private static final long serialVersionUID = 1L;

    public JFrameMaximize() {
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    // A Fake Dimension, inside this panel are a lot of swing components
    panel.setPreferredSize(new Dimension(333, 666));

    setContentPane(panel);

    // Now we want to set the Extended State
    if (Toolkit.getDefaultToolkit().isFrameStateSupported(MAXIMIZED_BOTH)) {
        setExtendedState(MAXIMIZED_BOTH);
    } else {
        System.out.println("Oh oh... i have a problem...");

        // Now we need a Fullscreen but we dont have the size of a WindowManager Panels and
        // stuff
        Dimension max = Toolkit.getDefaultToolkit().getScreenSize();
        // asume that the screen has a 20px bar on top (=awesome wm)
        max.height -= 20;
        setSize(max);
        setLocation(0, 20);
        // The alternative is to call pack() here, but then the window is totally broken, because of the internal components. Every Panel we load in here has a different size, so the window will scale up and down on every panel change.
    }
    }

    public static void main(String... args) {
    new JFrameMaximize();
    }
}

問題は、一部のウィンドウマネージャーにはMaximize_both拡張状態がないため、計算する必要があることです。これは、すべてのPCで知ることは不可能です。すべてのウィンドウマネージャーでウィンドウを正しいサイズに設定するにはどうすればよいですか?

唯一の解決策は、固定されたデフォルトサイズであり、これはJFrame?に与えられます。とウィンドウを最大化しようとしますか?

4

1 に答える 1

1

いくつかの観察:

  • 常にイベントディスパッチスレッドで開始します。

  • 呼び出してからフレームサイズpack() 調整してから実行しますsetVisible()

  • 使用を検討してくださいgetMaximumWindowBounds()

    GraphicsEnvironment env =
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    Rectangle bounds = env.getMaximumWindowBounds();
    

改訂されたsscce

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameMaximize extends JFrame {

    public JFrameMaximize() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        // A fake panel representing many swing components
        panel.setPreferredSize(new Dimension(333, 666));
        panel.setBorder(BorderFactory.createLineBorder(Color.blue, 10));
        this.add(panel);
        this.pack();
        // Now we want to set the Extended State, if supported
        if (Toolkit.getDefaultToolkit().isFrameStateSupported(MAXIMIZED_BOTH)) {
            System.out.println("Frame state supported.");
            this.setExtendedState(MAXIMIZED_BOTH);
        } else {
            System.out.println("Frame state not supported.");
            Dimension max = Toolkit.getDefaultToolkit().getScreenSize();
            // TODO see getMaximumWindowBounds()
            max.height -= 20;
            this.setSize(max);
            this.setLocation(0, 20);
        }
        this.setVisible(true);
    }

    public static void main(String... args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JFrameMaximize();
            }
        });
    }
}
于 2012-01-19T02:56:40.527 に答える