2012-05-10 28 views
5

私はJButtonを持っており、それを押すとモーダルダイアログが開きます。私がダイアログを閉じると、マウスを動かすまでまだボタンが押されているように見えます。 JDialogはAWTコンポーネント(AWT Canvasを使用する第三者コンポーネントであり、変更できません)の上に開かれているため、これが起こっていると思います。ダイアログを開いてスイングコンポーネントで閉じると、正しく動作します。ダイアログが閉じた後にJavaスイングボタンが正しく再描画されない

ダイアログにウィンドウリスナーを追加し、ダイアログが閉じたときにフレーム全体を再ペイントしようとしましたが(repaintとpaintImmediatelyを使用していますが、これは機能しません)。どのようにこれを修正するための任意の提案?

ここにSSCCEの例があります。ボタンを押してダイアログを閉じます。緑色のセクションの上にマウスを移動するまで、ボタンの周りにフォーカス枠が表示されていることに注意してください。方便として

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class DialogExample 
{ 

    public static void main(String[] args) throws Exception 
    { 

     final JFrame jf = new JFrame("AWT/Swing Dialog Test"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton button = new JButton("show dialog"); 
     final Canvas canvas = new Canvas() { 
      @Override 
      public void paint(Graphics g) 
      { 
       g.setColor(Color.RED); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
     }; 
     canvas.setPreferredSize(new Dimension(200,200)); 

     button.setAction(new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       JDialog dlg = new JDialog(jf,"modal"); 
       dlg.add(new JLabel("hello")); 
       dlg.setModal(true); 
       dlg.pack(); 
       dlg.setLocationRelativeTo(canvas); 
       dlg.setVisible(true); 
      }    
     }); 
     button.setText("press me"); 
     button.setFocusable(false); 
     JPanel panel = new JPanel(); 
     panel.setBackground(Color.GREEN);   
     panel.setPreferredSize(new Dimension(200, 200)); 
     jf.setLayout(new BorderLayout()); 
     panel.add(button); 
     jf.add(panel, BorderLayout.NORTH); 
     jf.add(canvas, BorderLayout.SOUTH); 
     jf.setSize(new Dimension(400,400)); 
     jf.setVisible(true); 
    }  
} 
+1

*「はJDialogのは、AWTコンポーネントの上に開いているので、私はこれが起こっていると思います」*なぜ[SSCCE](http://sscce.org/)でそれを再現しようとしないのですか? –

+1

私は長い間、AWTコンポーネントを使用していません。私が覚えているのは、それをSwingと混ぜると困ってしまうことだけです。しかし、私は[SSCCE](http://sscce.org) –

+1

@Guillaumeを持って来ることを提案します。それは、通常は 'JComboBox'のドロップダウンやツールチップのようなSwing浮動要素にのみ適用されますが。私は、AWTコンポーネントが1つのウィンドウにあり、別のウィンドウでスイングしているときに起こることは決して知りませんでした。 Java 7にはAWT&Swingコンポーネントを自由に混在させるためのフラグが用意されているようです。 –

答えて

5

actionPerformed()でダイアログ戻ったとき、あなたはロールオーバー状態をクリアすることができます。

@Override 
public void actionPerformed(ActionEvent e) { 
    JDialog dlg = new JDialog(jf, "modal"); 
    dlg.add(new JLabel("hello")); 
    dlg.setModal(true); 
    dlg.pack(); 
    dlg.setLocationRelativeTo(canvas); 
    dlg.setVisible(true); 
    button.getModel().setRollover(false); 
} 
+0

ありがとう、私は試してみて結果に返信します。 –

+1

トリック、ありがとう –

+0

+1。シンプルなソリューション –

関連する問題