У меня есть кнопка JButton, и нажатие на нее открывает модальный диалог. Когда я закрываю диалоговое окно, кнопка по-прежнему выглядит так, как будто она все еще находится в нажатом состоянии, пока я не перемещу мышь. Я думаю, это происходит потому, что JDialog открывается поверх компонента AWT (это сторонний компонент, который использует AWT Canvas, и я не могу это изменить). Если я открываю диалоговое окно и закрываю его над компонентом качания, то он работает правильно.
Я пытался добавить в диалог прослушиватель окна и перерисовывать весь кадр (используя 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);
}
}