JavaアプリケーションのGUIを表すJFrameがあります。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);
}
});
}
}