2009-06-02 33 views
52

JDialogタイトルバーから閉じるボタン(「X」)を削除する方法はありますか?Swing JDialogの「X」ボタンを削除

+7

私はあなたの代わりに他のボタンのいずれかを押すように言って閉じるボタンを押すと、別のダイアログを表示するいくつかのアプリケーションを見てきました。天才! –

答えて

1

PL & Fを装飾し、名前でコンポーネントを削除するように設定します。

+1

PL&Fとは何ですか?ありがとう。 – kenshinji

+0

PL&Fはプラガブルルックアンドフィールです。スイングは醜い方法で任意のルックアンドフィールをとることができます。 –

+2

なぜ醜いのですか?それを行う正しい方法は何でしょうか? –

53

dialog.setUndecorated(true)を呼び出してダイアログタイトル全体を削除することはできますが、これはダイアログをもう移動できないことを意味します。

ボタンが何もしないようにdialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)を実行することもできます。

それ以外にも、Xを完全に削除する方法はないと思います。

13

私はdialog.setUndecorated(true)に電話してタイトルバーを削除できると思います。しかし、ちょうど 'X'についてはわからない。

ユーザーがダイアログを簡単に閉じることができるようにするには、「X」を削除することは効果的ではありません。

dialog.setDefaultCloseOperationまたはWindowListenerを使用してユーザーが「X」をクリックしたときの状況を制御することをお勧めします。

9

Java 1.7(AKA DolphinまたはJava 7)では、ウィンドウの閉じるボタンを無効または削除できません。最大化ボタンはframe.setResizable(false)で削除/無効にすることができ、またはそれを拡張するクラス(javax.swing.JDialogなど)を使用して、最小化および最大化ボタンを削除できます。 frame.setUndecorated(true)でタイトルバー、枠線、ボタンを削除することができます。タイトルバーのすべてのボタンの可視性を完全に制御できます(プラットフォーム間の互換性とOS統合を失うことがあります)。frame.setDefaultLookAndFeelDecorated(true)(JFrameまたはJDialog)。これは現在のJDKで可能なすべてのコントロールです。

+4

これは[バグパレード](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5085932)の「修正されません」です。 –

+0

これは完全に正しいわけではありません。 OS XでJDialogをサブクラス化/インスタンス化すると(El Capitanでテストされても)、タイトルバーからボタンが削除されることはありません。また設定の組み合わせもありません(すべての組み合わせを試しました)。 'setUndecorated(true)'だけがそれらをすべて削除しますが、タイトルバーに沿って移動します。あなたは確かにタイトルバーのボタンの動作を変更することができますが、外観については...私が不満足な解決策や移植性のないコードに時間をかけすぎてしまったのは非常に難しい状況です。 – EntangledLoops

+0

@EntangledLoopsあなたのコメントをお寄せいただきありがとうございます! JDialogがOS Xダイアログの最小化/「最大化」ボタンを_remove_しないのは事実ですが、最小化を無効にします。私はこれをテストするためのMacを手にしていませんが、最大化ボタンでサイズを変更するだけです。dialog.setResizable(false)を設定すると、緑のボタンも無効になります!とにかく、私が答えて言ったように、これを完全に支配していないのはうんざりですが、JSEクリエイターがすべてのプラットフォームでどのようにプログラムを作っているのか想像することができます。 ; 3 – Supuhstar

-3
static public void removeButtons(Component c){ 
    if (c instanceof AbstractButton){ 
     String accn = c.getAccessibleContext().getAccessibleName(); 
     Container p=c.getParent(); 
     //log.debug("remove button %s from %s",accn,p.getClass().getName()); 
     c.getParent().remove(c); 
    } 
    else if (c instanceof Container){ 
     //log.debug("processing components of %s",c.getClass().getName()); 
     Component[] comps = ((Container)c).getComponents(); 
     for(int i = 0; i<comps.length; ++i) 
      removeButtons(comps[i]); 
    } 
} 
+7

これは、ダイアログのクローズボタンではなく、ダイアログに追加されたボタンをすべて削除します。 –

+0

タイトルバーボタン(OS X)には影響しません。 – EntangledLoops

+1

これは実際にはおかしなことですが、あなたがボタンx3を使用すると、あなたのアプリは陽気に使えない状態になります – Supuhstar

4

は、ここに私の経験です:

setUndecorated(true)を使用してみました
  • :全体Dialogは目に見えないメイド。
  • 試しましたsetDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE):これは動作をまったく変更しませんでした。私のダイアログボックスは閉じたままです。デフォルトのクローズ操作をDO_NOTHING_ON_CLOSEに設定すると、WindowListenerのメソッドにクローズ操作が委譲されます。私のために働いた何

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
//Remove any existing WindowListeners 
for (WindowListener wl : this.getWindowListeners()) 
     this.removeWindowListener(wl); 
this.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
       if ("Optional condition") { 
         JOptionPane.showMessageDialog(null, "You cannot close this window"); 
       } 
     } 
}); 
関連する問題