全画面JavaのJFrame


110

私はすぐにプロジェクトを行う予定であり、その中でフルスクリーンモードを使用する必要があります

ウィンドウにグラフィックを描画します。JFrameなどを使用すると便利です。

画面の最終的な解像度がどうなるかわかりません。グラフィックが自動的に再スケーリングされるかどうか教えてください。

JFrame jf = new JFrame();
jf.setSize(1650,1080);
//make it fullscreen;
//now is everything is going to be rescaled so it looks like the original?

「フルスクリーン」を定義する必要があります。以下の回答とともに、フレームを装飾するかどうか(つまり、タイトルバーと境界線を含む)を検討することをお勧めします。カスタムペイントを実行している場合を除き、再スケーリングは行われません。通常のSwingコンポーネントとレイアウトマネージャーを使用している場合は、レイアウトが新しい画面解像度に調整されることがわかります。もちろん、テストしたいと思うでしょう;)
MadProgrammer '20 / 07/20

Lion Fullscreenを使用しますか?
LanguagesNamedAfterCofee

回答:


206

追加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);

52
またframe.setUndecorated(true);、本当にフルスクリーンになります。
ヨーダ

あなたはGNU / Linuxを使用している場合は、設定する必要がありますDisplayMode.BIT_DEPTH_MULTIし、DisplayMode.REFRESH_RATE_UNKNOWN新しい表示モードを適用するとき。使う必要はありませんでしたsetExtendedState。Java 8でKubuntu 15.10を使用してテストされた動作
code_dredd

私はJava8を使用しています。装飾されていないため例外がスローされ、装飾されていないものを削除すると、コードは正常に機能し、フレームも全画面になります。
shaILU 2017年

エラーと理由をお知らせします。AppFrameクラスを1つ作成し(いくつかのデフォルトプロパティを使用)、JFrameとしてクラスを作成するために、単にそれを拡張します。これは、setVisibleをtrueにしています。ここで、上記の3行は同じ順序でなければなりません。visibleがExtendedStateの前にある場合は、エラーが発生します。注文エラーを修正したところ、タイトルバーのないJFrameが表示された場合......Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU


39

フレームをフルスクリーンモードにする場合(フルスクリーンの映画のように)、これらの回答を確認してください。

クラスjava.awt.GraphicsEnvironmentjava.awt.GraphicsDeviceは、1つの画面で全画面モードにアプリを配置するために使用されます(非肯定的)。

例えば:

static GraphicsDevice device = GraphicsEnvironment
        .getLocalGraphicsEnvironment().getScreenDevices()[0];

public static void main(String[] args) {

    final JFrame frame = new JFrame("Display Mode");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setUndecorated(true);

    JButton btn1 = new JButton("Full-Screen");
    btn1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(frame);
        }
    });
    JButton btn2 = new JButton("Normal");
    btn2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(null);
        }
    });

    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    panel.add(btn1);
    panel.add(btn2);
    frame.add(panel);

    frame.pack();
    frame.setVisible(true);

}

@Paul Vargas:装飾されていないウィンドウにメニューバーを追加することもできます。終了するには、あなたの例では、「alt + F4」と入力する必要があります。
カードマン2017年


7

1つの方法は、拡張状態を使用することです。これは、基盤となるOSにJFrameを最大化するように要求します。

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

他のアプローチは、要件に合わせて画面を手動で最大化することです。

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

しかし、これにはUbuntu OSに落とし穴があります。私が見つけた回避策はこれでした。

if (SystemHelper.isUnix()) {
    getContentPane().setPreferredSize(
    Toolkit.getDefaultToolkit().getScreenSize());
    pack();
    setResizable(false);
    show();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Point p = new Point(0, 0);
            SwingUtilities.convertPointToScreen(p, getContentPane());
            Point l = getLocation();
            l.x -= p.x;
            l.y -= p.y;
            setLocation(p);
        }
    });
}

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

Fedoraでは、上記の問題は存在しません。しかし、GnomeKDEには複雑な問題があります。だから注意してください。お役に立てれば。


6

これまでで最も簡単な修正:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}

d frame.setExtendedState(JFrame.MAXIMIZED_BOTH);とソリューションの違いは何ですか?
ヨーダ

ソリューションのフレームが必要です。一方、私の場合はそうしません。プログラムのすべてのウィンドウを自動的にループします
Ariel Terrani

よくやった。この修正はmacOSでさらに効果的に機能します。他の修正でもメニューバーが表示されたままになるためです。この修正により、すべてが完全に非表示になります。これは受け入れられる答えになるはずです。
Panayotis

5

このコードを使用してください:

import java.awt.event.*;
import javax.swing.*;

public class FullscreenJFrame extends JFrame {
    private JPanel contentPane = new JPanel();
    private JButton fullscreenButton = new JButton("Fullscreen Mode");
    private boolean Am_I_In_FullScreen = false;
    private int PrevX, PrevY, PrevWidth, PrevHeight;

    public static void main(String[] args) {
        FullscreenJFrame frame = new FullscreenJFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setVisible(true);
    }

    public FullscreenJFrame() {
        super("My FullscreenJFrame");

        setContentPane(contentPane);

        // From Here starts the trick
        FullScreenEffect effect = new FullScreenEffect();

        fullscreenButton.addActionListener(effect);

        contentPane.add(fullscreenButton);
        fullscreenButton.setVisible(true);
    }

    private class FullScreenEffect implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (Am_I_In_FullScreen == false) {
                PrevX = getX();
                PrevY = getY();
                PrevWidth = getWidth();
                PrevHeight = getHeight();

                // Destroys the whole JFrame but keeps organized every Component
                // Needed if you want to use Undecorated JFrame dispose() is the
                // reason that this trick doesn't work with videos.
                dispose();
                setUndecorated(true);

                setBounds(0, 0, getToolkit().getScreenSize().width,
                        getToolkit().getScreenSize().height);
                setVisible(true);
                Am_I_In_FullScreen = true;
            } else {
                setVisible(true);
                setBounds(PrevX, PrevY, PrevWidth, PrevHeight);
                dispose();
                setUndecorated(false);
                setVisible(true);
                Am_I_In_FullScreen = false;
            }
        }
    }
}

これがお役に立てば幸いです。



2

まず第一に、それはあなたが使いたい解像度です1650,1080

追加します:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

JFrameのコンポーネントに問題がある場合は、frame.add(component)メソッドを使用してすべてのコンポーネントを追加した後、次のステートメントを追加します。

frame.pack();

1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

これはフレームを画面のサイズにするだけです



0

これだけが必要です:

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

MAXIMIZED_BOTH修飾子を使用すると、ウィンドウ全体(高さと幅)で最大になります。

これを使用することを提案したものがあります:

frame.setUndecorated(true);

ウィンドウにはヘッダーがないため、閉じる/復元/最小化ボタンがないため、お勧めしません。


0

値は私が意味することを強調しました:

JFrame-プロパティ


写真は暗黙的に回答を提供する場合がありますが、説明も含めて回答を詳しく説明してください。imhoですが、あなたの答えは実際には既存のものと同じなので、本当にこの答えを精巧に残しておきたいかどうか慎重に考えてください。
Yohanes Khosiawan许先汉2014年

-1

以下の2つのプロパティを設定します。

  1. extendedState = 6
  2. resizeable = true

わたしにはできる。


2
最終的な静力学は理由があります。
ヨーダ

うーん... netBeans 8.0.1では、「サイズ変更可能」+「サイズ変更可能」プロパティ(プロパティウィンドウ)の値にJFrameを設定できます
Rudi Wijaya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.