5

JButton があり、それを押すとモーダル ダイアログが開きます。ダイアログを閉じても、マウスを動かすまでボタンは押されたままのように見えます。これは、JDialog が AWT コンポーネントの上で開かれているために発生していると思います (これは AWT Canvas を使用するサードパーティ コンポーネントであり、変更できません)。ダイアログを開き、swing コンポーネントの上で閉じると、正しく機能します。

ダイアログにウィンドウ リスナーを追加し、ダイアログが閉じたときに (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);
    }    
}
4

1 に答える 1

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);
}
于 2012-05-11T01:12:45.607 に答える