0

カスタム グラスペイン コンポーネントを作成し、それを myJFrameおよびJDialogclasses に設定しました。カスタム グラスペインでマウス イベントをインターセプトしません。必要がないためです。また、GUI にはツリーやポップアップなどの多くのコンポーネントがあり、マウス イベントをインターセプトして転送するのが複雑になるためです。フレーム/ダイアログ内getMousePosition()の他のコンポーネント (例: )を呼び出すたびに が返されることを除いて、すべてがそのまま正常に動作します。JPanelnull

私のJFrameJDialogクラスでは、グラスペインをdisabled(but visible) に設定しましたが、ほとんどの場合は機能します。getMousePosition()グラスペイン コンポーネントにマウス イベント リスナーを追加しなくても、メソッドが正しい値を返すにはどうすればよいですか。

問題を示すサンプル コード。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class GlassPaneExample
{
private JPanel panel;
private JButton btn;
private JLabel response;
private int counter = 0;

GlassPaneExample()
{
    buildUI();
}

private void buildUI()
{
    JFrame frame = new JFrame("GlassPane Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(getPanel());
    frame.setGlassPane(new MyGlassPane());
    frame.getGlassPane().setVisible(true);
    frame.getGlassPane().setEnabled(false);
    frame.setPreferredSize(new Dimension(200, 220));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

JPanel getPanel()
{
    panel = new JPanel(new BorderLayout());
    panel.addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e)
        {
        }

        @Override
        public void mouseMoved(MouseEvent e)
        {
            System.out.println("mousePosition : " + panel.getMousePosition());
            System.out.println("mousePosition(true) : " + panel.getMousePosition(true));
        }
    });

    btn = new JButton("Click here...");
    btn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            response.setText("Button click number " + getButtonClickCount());
        }
    });

    response = new JLabel();
    response.setToolTipText("Response label");

    panel.add(btn, BorderLayout.NORTH);
    panel.add(response, BorderLayout.SOUTH);
    return panel;
}

private int getButtonClickCount()
{
    return counter++;
}

public static void main(String[] arg)
{
    new GlassPaneExample();
}

class MyGlassPane extends JComponent
{
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(10,40,120,120);
    }
}
}

ガラス板をフレームに追加するための 3 行をコメント アウトすると、マウスの位置が正しく出力されます。これは問題を説明するための簡単な例です。上で述べたように、マウス リスナーをカスタム グラスペイン コンポーネントに追加すると、他の複雑さが生じるため、これを追加したくありません。

4

0 に答える 0