web-dev-qa-db-ja.com

フレームが表示された後にsetUndecorated()を呼び出す方法は?

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

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

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

フレームが表示された後、どうすればよいですか?.

21
Lucky

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

ただし、フレーム内の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つのフレームにしか配置できないため、新しいフレームに追加すると、すぐに古いフレームに配置されなくなります。

17
Steve McLeod

Frame.dispose()を呼び出してから変更しましたか?私自身は試していませんが、うまくいくかもしれません。

そうでない場合、できることは、フレームをクラスの重要ではない部分にして、最上位レベルのパネルへのフックを最小限に抑え、それらを新しいフレームに移動することです。すべての子供たちが続きます。

25
Yishai

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

dispose();
setUndecorated(true/false);
setVisible(true);
12
Thomas

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);
_

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

12
private_lock

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

試してください:

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

見てみな。それが役に立てば幸い!

これが作る方法のコードです ALTEnter バーモードなしでフルスクリーンになり、タイトルバーとスタートバーを表示して最小化します:

public class myTest extends JFrame{
 //Your codes...
     //if "ALT" key on hold and "Enter" key pressed with it
     if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {    
         //if the JFrame has Title bar
         if (isUndecorated()) {
             //this will dispose your JFrame
             dispose();
             //here to set it with no Title bar
             setUndecorated(false);
             pack();
             setLocationRelativeTo(null);
             //as you dispose your JFrame, you have to remake it Visible..
             setVisible(true);
          } else {
             dispose();
             setUndecorated(true);
             setExtendedState(MAXIMIZED_BOTH);
             setVisible(true);
        }
    }
//your codes
}
1
Eng.Eyad S.