2

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

2 に答える 2

2

opaqueset ieを忘れた可能性があると思います。setOpaque(true).

これにより、フレームとボタンの背景色を変更できますbutton.setOpaque(true)

試してみてください、それはあなたを助けるかもしれません。

于 2012-08-29T13:41:34.233 に答える
1

非モーダル ダイアログを使用し、dialog.setAlwaysOnTop(true); を呼び出します。お役に立てれば

于 2012-08-29T13:11:58.970 に答える