6

複数のサブコンポーネントを持つスイングコンポーネントがあります。マウスがそれらのコンポーネントのいずれかにある場合はラベルを変更し、マウスがすべてのコンポーネントから離れた場合は別のラベルに変更します。これを行うためのより効率的な方法を見つけようとしています。

現在、次のようなすべての子コンポーネントにマウス リスナーがあります。

class AMouseListener extends MouseAdapter {
    private boolean mouseOver;
    mouseEntered(MouseEvent e) { mouseOver = true; updateLabel(); }
    mouseExited(MouseEvent e) { mouseOver = false; updateLabel(); }

    void updateLabel() {
       String text = "not-over-any-components";
       // listeners are each of the listeners added to the child components
       for ( AMouseListener listener :listeners ) {
          if ( listener.mouseOver ) {
             text = "over-a-component";
             break;
          }
       }
    }
}

これは機能しますが、親コンテナーで mouseEntered および mouseExited イベントのみを処理することでこれを処理するより良い方法があるはずだと思いますが、子コンポーネントがこれらのイベントをインターセプトするため、これを行う方法がわかりません (私は必ずしも子コンポーネントを制御できるとは限らないため、必要に応じてマウスイベントを親イベントに転送できません)。

4

4 に答える 4

7

例えば

ここに画像の説明を入力

ここに画像の説明を入力

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class TestMouseListener {

    public static void main(String[] args) {
        final JComboBox combo = new JComboBox();
        combo.setEditable(true);
        for (int i = 0; i < 10; i++) {
            combo.addItem(i);
        }
        final JLabel tip = new JLabel();
        tip.setPreferredSize(new Dimension(300, 20));
        JPanel panel = new JPanel();
        panel.add(combo);
        panel.add(tip);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        panel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                tip.setText("Outside combobox");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                Component c = SwingUtilities.getDeepestComponentAt(
                   e.getComponent(), e.getX(), e.getY());
                // doesn't work if you move your mouse into the combobox popup
                tip.setText(c != null && SwingUtilities.isDescendingFrom(
                   c, combo) ? "Inside combo box" : "Outside combobox");
            }
        });
    }

    private TestMouseListener() {
    }
}
于 2012-06-18T22:22:35.623 に答える
2

「ガラス板」のドキュメントと例を確認してください。
これで必要なものが得られるはずです: The Glass Pane

于 2012-06-18T21:54:51.417 に答える
1

リスナーの単一のインスタンスを開始し、そのインスタンスを各コンポーネントに追加できます。このような:

AMouseListener aMouseListener=new  AMouseListener();

for each(Component c:components) {
caddMouseListener(aMouseListener);
}
于 2012-06-18T22:05:54.390 に答える