2016-07-10 7 views
0

私はSwing GUIを使ってJava Desktop Applicationを作った。メニューバーには「About」という項目があります。この「About」メニュー項目をクリックすると、JDialogがJOptionPane.showMessageDialog(...)を使用して表示され、アイコン、プログラムに関するテキスト、ダイアログを閉じるための「OK」ボタンが表示されます。背景Java JOptionPaneカスタム描画

ダイアログの背景を移動して色を変える1つ以上のボール(円)の効果を描きたいと思います。

@Titusの溶液で更新されたコード:

カスタムのJOptionPaneクラス:

class MyEffectPane extends JOptionPane { 

    public MyEffectPane(String message, int type){ 
     super(message, type); 

     makeOpa(this); 
    } 

    // needed to make the drawings visible 
    void makeOpa(JComponent comp){ 
     for(Component c : comp.getComponents()){ 
      if(c instanceof JPanel){ 
       JPanel p = (JPanel)c; 
       p.setOpaque(false); 
       makeOpa(p); 
      } 
     } 
    } 


    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int width = getWidth(); 
     int height = getHeight(); 

     g.setColor(Color.BLACK); 

     g.fillOval(width/2-50, height/2-50, 50, 50); 
    } 
} 

コール/ショーダイアログ:

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(this, "About"); 
    //dialog.setIconImage(icon.getImage()); 
    dialog.setVisible(true); 
    dialog.dispose(); 
+1

'showMessageDialog'メソッドは' static'です(オーバーライドすることはできません)。独自の 'JOptionPane'オブジェクトを作成します。 – Titus

+0

@Titusありがとう、私の問題の解決策をご存知ですか? – trinity420

+1

デバッグ文には、 'System.out.println()'を使わないでください。 'System.out'はバッファされたストリームであるため、必ず実行されるたびに行を出力するとは限りません。代わりに 'System.err.println()'を使用して、すぐに保証された出力を得てください。 –

答えて

3

showMessageDialog方法はstatic(あなたができることですそれをオーバーライドします)、それ自身のJOptionPaneオブジェクトを作成します。

あなたはshowMessageDialogがある、何をしているかに再現することができます

/** 
* This method shows an INFORMATION_MESSAGE type message dialog. 
* 
* @param parentComponent The component to find a frame in. 
* @param message The message displayed. 
*/ 
public static void showMessageDialog(Component parentComponent, Object message){ 
    JOptionPane pane = new JOptionPane(message, INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(parentComponent, null); 
    dialog.show(); 
} 

そして、あなたはこのような何かにそれを変更することができます。また

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
JDialog dialog = pane.createDialog(this, null); 
dialog.show(); 

、あなたはこのコンストラクタを追加する必要がありますあなたのMyEffectPaneクラス:

MyEffectPane(String message, int type){ 
    super(message, type); 
} 
+0

ありがとう!!!!これは完全に動作します!私はJDialogのコンポーネントが 'setOpaque(false)'を使って私のdrawinを隠さないようにいくつかのコードを追加しました。私は作業コードでポストを更新します。 – trinity420

2

ダイアログの背景を移動して色を変える1つ以上のボール(円)の効果を描きたい。

JOptionPaneは使用しないでください。

代わりにカスタムJDialogを作成することができます。次に、カスタムペイントを行うダイアログにJPanelを追加します。

詳細については、Custom PaintingのSwingチュートリアルのセクションをお読みください。

注:カスタムペイントを行うときは、オーバーライドpaintComponent(..)を使用してください。ペイントしないでください(...)。

また、カスタムJPanelをJOptionPaneに追加することもできます。いずれにしても、JPanelでカスタムペインティングを行うことが鍵です。

+0

ありがとうございますが、@ Titusのメソッドは完全に動作します。私はこれを試しましたが、問題は、あなたのテキスト、アイコン、およびJDialogのOKボタンを見栄えのために調整する必要があるということです。パネルを追加することはできますが、描くことができる領域は狭く、通常のJDialogのテキストが配置されている領域です。 – trinity420

1

JOptionPaneをオーバーライドすることはできません。これは静的であり、ほとんどの場合、確認オプションを簡単に作成するために使用されます。

希望するものについては、JDialogを使用できます。 JDialogを使用すると、カスタマイズした内容のポップアップウィンドウを簡単に作成できます。

すでにJOptionPaneを使用しようとしているので、JOptionPaneをトリガーするパネルが含まれていると仮定します。

  1. 親パネルから含むウィンドウを抽出するには、SwingUtilities.getWindowAncestor(panel)を使用してください。
  2. 抽出したウィンドウを使用してJDialogを作成します。JDialog dialog = new JDialog(containerWindow)
  3. JDialogの機能を好みに合わせてカスタマイズします。

あなたのコードの一部は次のようになります。この場合

Window containerWindow = SwingUtilities.getWindowAncestor(panel); 
JDialog dialog = new JDialog(containerWindow); 
dialog.setLayout(new BorderLayout()); 
dialog.setLocationRelativeTo(containerWindow); 
dialog.setResizeable(false); 
dialog.add(effectPanel, BorderLayout.CENTER); 

effectPanelは、グラフィックスとあなたがしたいすべてのものを使用して独自のカスタムパネルです。これは、コードを書くための最良の方法ではありませんが、私はあなたのための例としてそれを書いています。 JDialog

+0

ありがとうございました!これは非常に興味深いようです!結果的にJDialogがBorderLayoutを使用しているために良く見えないことが問題であると思われます。たとえば、OKボタンは下部に全幅のサイズを取得します。または私は間違っていると思いますか?しかし、@ Titusメソッドは完全に動作します。 – trinity420

+1

例としてBorderLayoutを使用しました。必要なレイアウトを使用できます。あなたが簡単な解決策を見つけたらそれは素晴らしいことです! オプションパネルで行う必要がある場合は、少し複雑になり、JDialogがより便利になるかもしれません。 – Migsarmiento

+0

あなたが正しいと思うかもしれません。 – trinity420