我有一个JFrame,它代表我的Java应用程序的GUI。 我有一个自定义按钮,从JComponent派生并创建并放置在这个JFrame上。按下此按钮会出现一个模态对话框。
问题是,在出现模式对话框后,JFrame停止从鼠标接收鼠标事件。我打开了Spy ++,发现Windows中的MouseEvents传递给了JFrame。所以他们在Java的某个地方被关闭了。
我需要接收按钮事件 - 当鼠标进入我的自定义按钮区域时,按钮会改变颜色。我需要知道鼠标何时退出按钮区域,将按钮更改为原始颜色。标准JButton也存在同样的问题 - 在模态对话框出现后它仍然悬停。
当然我可以自己跟踪模态对话框的开启,并使我的按钮不受影响,但只是好奇,如果有标准的解决方案。
您会看到,当对话框出现时,JFrame上的按钮仍然悬停。
package quixote.sscce;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class FrameTop extends JFrame implements MouseListener, ActionListener {
private JButton button;
public FrameTop() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 200);
setLocation(100, 100);
setLayout(new BorderLayout());
button = new JButton("Click me");
add(button, BorderLayout.CENTER);
button.addActionListener(this);
addMouseListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
JDialog dialog = new JDialog(this, "dialog");
dialog.setModal(true);
dialog.setLocation(150, 150);
dialog.setSize(100, 100);
dialog.setVisible(true);
}
private int aaa = 0;
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}
@Override
public void mouseEntered(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}
@Override
public void mouseExited(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}
@Override
public void mousePressed(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}
@Override
public void mouseReleased(MouseEvent arg0) {
System.out.println("XXX " + aaa);
}
public static void main(String args[]) {
final FrameTop top = new FrameTop();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
top.setVisible(true);
}
});
}
}
答案 0 :(得分:2)
我想你可能忘了设置opaque
即。 setOpaque(true)
。
这将允许您更改框架和按钮button.setOpaque(true)
的背景颜色。
尝试一下,它可能对你有帮助。
答案 1 :(得分:1)
使用非模态对话框,并调用dialog.setAlwaysOnTop(true); 希望这有帮助