我有一个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);
}
}
JComboBox
的下拉菜单或工具提示。我从未见过在一个窗口中使用AWT组件而在另一个窗口中使用Swing时发生这种情况。Java 7显然提供了一个标志,旨在允许自由混合使用AWT和Swing组件。 - Andrew Thompson