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