2

入力要素とは、JSpinners や JComboxBoxes などを意味します。私のグラスペインには、JSpinners、JComboBoxes、そして大部分の JLabels を含む JPanel が渡されます。ガラス板には MouseListener がアタッチされています。驚くべきことに、マウス カーソルが入力要素を離れ、JPanel の他の部分または空きスペースの上にマウス カーソルを置いたときに、mouseEntered が呼び出されます。これは正常な動作ですか?入力要素を Glasspane の目的で JPanel の一部と見なすにはどうすればよいですか?

これは、入力要素と jLabels を含む私の UI のスクリーンショットです。 サンプル UI

コードの例を次に示します。

import javax.swing.*;

public class DialogTest {
    public DialogTest() {
        JPanel dialogPanel = new JPanel();
        SpinnerModel edgeModel = new SpinnerNumberModel(1, 1, 9, 1);
        JSpinner edgeSpn = new JSpinner(edgeModel);
        dialogPanel.add(edgeSpn);

        JDialog initialDialog = new JDialog(new JFrame(), "Test", true);
        initialDialog.setContentPane(dialogPanel);
        initialDialog.pack();
        glass = new GlassComponent(dialogPanel);
        initialDialog.setGlassPane(glass);
        glass.setOpaque(false);
        glass.setVisible(true);
    initialDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    initialDialog.setVisible(true);
    }
}

public class GlassComponent implements MouseListener {
   JPanel c;
   public GlassComponent(JPanel c) {
       this.c = c;
       this.c.addMouseListener(this);
   }

   ...
   public mouseEntered(MouseEvent e) {
       System.out.println("Entered JPanel");
   }    
}

説明として、私の目標は最終的に GlassPane を使用して、禁止標識でマークされた要素への入力をブロックすることです。ただし、dialogPanel に割り当てられた mouseListener が、入力要素を離れたときに新しいイベントを生成しているように見えることを考えると、これを実現するのは難しいかもしれません。

4

3 に答える 3

4

使用してはいけないと思う方法でガラス板を使用しているようです。

私の知る限り、ガラス板は通常、コンポーネントをまったく保持するのではなく、トップレベルウィンドウを覆い、その下にあるコンポーネントのゲートキーパーとして機能し、すべてトップレベルウィンドウによって保持されます。 contentPane。

于 2012-03-14T18:05:19.407 に答える
4
于 2012-03-14T19:37:27.100 に答える
4

The Glass Paneデモのメソッド に示すように、マウス イベントを下層のコンポーネントに転送できますredispatchMouseEvent()

于 2012-03-14T20:29:45.773 に答える