21

私の Swing アプリケーションでは、フレーム全体を再作成することなく、装飾されたものと装飾されていないものを切り替える機能が必要です。setUndecorated()ただし、フレームが表示された後にAPI を呼び出すことはできません。

を呼び出してもsetVisible(false)isDisplayable()true が返されます。API によると、フレームを非表示にする唯一の方法はフレームを再作成することです。ただし、一部のタイトル バーをオフにするためだけにフレームを再作成したくありません。

フルスクリーン モードとウィンドウ モードを切り替えることができるフルスクリーン対応アプリケーションを作成しています。状態などを維持したまま切り替えができるはずです。

フレームが表示された後にこれを行うにはどうすればよいですか?.

4

7 に答える 7

18

できません。私が同じことを達成しようとしたとき、それは私の経験でした。

ただし、フレーム内の 1 つのパネルに UI 全体がある場合は、新しいフレームを作成して、そのパネルをフレームに追加できます。それほど仕事ではありません。

このようなもの:

// to start with
JPanel myUI = createUIPanel();
JFrame frame = new JFrame();
frame.add(myUI);

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);

Swing では、パネル (および実際にはコンポーネントのインスタンス) は一度に 1 つのフレームにしか存在できないため、新しいフレームに追加すると、すぐに古いフレームに存在しなくなります。

于 2009-05-18T09:52:02.640 に答える
13

https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.javaをご覧ください。

メソッド内switchFullscreenMode():

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

実際には、マウスが側面に触れた場合に再表示されるさまざまなサイドパネルを非表示にするために、さらに多くのことが行われています。

また、境界を明示的に設定する必要があることに注意してください。Window.setExtendedState(MAXIMIZED_BOTH)dispose() のタイムリーな近くでひどく干渉します。これは、どちらもオペレーティング システムの複数のネイティブ イベントに依存しているためです。これらのイベントは、その瞬間にウィンドウを表示できなければ失われます。

デフォルトの画面を直接取得することはお勧めしません。

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

代わりにスクリーンを使用すると、JFrame は現在オンになっています。

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

現在は同じでも、将来変更される可能性があります。

于 2009-07-30T11:50:10.053 に答える
13

を呼び出すとdispose()、ネイティブ ウィンドウ リソースが解放されます。その後、装飾なしなどのプロパティを編集できます。次にsetVisible(true)、ウィンドウ リソースを再作成するために呼び出すだけで、すべて正常に動作します (位置とすべてのコンポーネントは変更されません)。

dispose();
setUndecorated(true/false);
setVisible(true);
于 2012-12-05T10:55:14.947 に答える
3

試す:

dispose();
setUndecorated(true);
setVisible(true);

見てみな。それが役立つことを願っています!!

于 2016-12-12T13:42:49.237 に答える
2

さて、別のフレーム インスタンスが必要になります。フレームを再作成せずに、フレームの内容を移動できる場合があります。ここで重要なのは、コードが特定のフレームに依存しないようにすることです。これは、どのような場合でも基本的なグッド プラクティスです。

于 2009-05-17T18:23:01.510 に答える