2012-03-14 11 views
2

入力要素とは、JSpinnersやJComboxBoxなどのことです。私のglasspaneには、JSpinners、JComboBoxes、そして大部分はJLabelsを含むJPanelが渡されます。 glasspaneにはMouseListenerが添付されています。驚くべきことに、mouseEnteredはマウスカーソル上で入力要素を残して呼び出され、JPanelの他の部分または空の領域の上にカーソルを置いてください!これは正常な動作ですか? GlassPaneの目的のために入力要素をJPanelの一部とみなすにはどうすればよいですか?Glasspaneの目的のために、Swingの入力要素が一見JPanelの一部と見なされないのはなぜですか?

ここに、入力要素とjLabelsを持つ私のUIのスクリーンショットがあります。ここで Sample 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

redispatchMouseEvent()

+0

私の目標を達成するのに役立つように思われるあなたの答えをありがとう。私はデモでredispatchMouseEvent()を見たことがありましたが、今まではその重要性や有用性を認識していませんでした。 +1 – Arvanem

+0

これは、コントロールが適用されないことを伝える斬新な方法であると推測するのは正しいですか? 'setEnabled()'や動的レイアウトも同様ですか? – trashgod

+0

ご意見ありがとうございました。あなたの推論は正しいです。残念ながら、setEnabled()は関連するJComponentsをグレイ表示して、ほとんど判読できないようにします。上記のスクリーンショットは、判読不能を正当化するものではありません。私はGoogleの動的レイアウトにする必要があります。 – Arvanem

4

ガラスパンを使用してはいけないと感じているようです。

私が知る限り、一般的にガラスパンはコンポーネントを保持するのではなく、トップレベルのウィンドウをカバーし、その下にあるコンポーネントのゲートキーパーとして機能することができます。トップレベルウィンドウのcontentPane

+0

こんにちはホバークラフト、あなたのコメントのおかげで、私はそれを評価し、尊重します。私は、ガラス板をどのように実装するかをさらに検討する必要があると思います。私の最初の懸念は、マウスの上にあるコンポーネントの空のガラスペインでは確認できないが、getDeepestComponentAt()はそれを解決すると考えている。 +1 – Arvanem

4
  • あなたがオーバーレイのためGlassPaneを使用することができますが、別の提案が使用JLayer可能性が

  • @camickrによってContainer or JComponent、または自分のコードhereまたはhereに基づいて、私の質問に、必要な(Java6のために必要なJava7がJXLayerあります)

The Glass Paneデモの方法のようにあなたは、基礎となるコンポーネントにマウスイベントを転送することができ
+1

こんにちはmKorbel、あなたの答えとその提案に感謝します。私はリンクしたコードをまだ消化中です。 :) +1 – Arvanem

関連する問題