-1

ループを使用して、マウスリスナーとともに複数の JLabels を JPanel に追加しようとしています。これらの JLabel にはマウス リスナーがあり、クリックするとアイコンが変更されます (label.setIcon() を使用)。ただし、一度に「選択」したいのは1つだけです。そのため、別のラベルがクリックされたときに、新しいラベルが選択される前にオフになることを認識できるようにする必要があります。ただし、私の問題は、これらのラベルをループで追加しているため、すべて同じ MouseListener を持つことです。

誰かがこれを達成する簡単な方法を教えてもらえますか?

4

1 に答える 1

1

これは、実装方法の短い例です (アイコンを使用せず、代わりにラベルを変更したことに注意してください)。

public class MouseListenerExample extends JFrame {

    public static class MyMouseListener extends MouseAdapter {
        private static final Collection<JLabel> labels = new ArrayList<JLabel>();
        private final JFrame frame;

        public MyMouseListener(JFrame frame, JLabel label) {
            this.frame = frame;
            labels.add(label);
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            for (JLabel label : labels) {
                String text = label.getText();
                if (text.startsWith("X ")) {
                    label.setText(text.substring(2));
                }
            }
            JLabel currentLabel = (JLabel) e.getComponent();
            currentLabel.setText("X " + currentLabel.getText());
        }

    }

    public MouseListenerExample() {
        super("MouseListener Example");
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        for (int i = 0; i < 10; i++) {
            JLabel jLabel = new JLabel("Label " + i);
            c.add(jLabel);
            jLabel.addMouseListener(new MyMouseListener(this, jLabel));
        }
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MouseListenerExample();
    }
}

主なアイデアは、MouseListenerラベルごとに新しいラベルを作成することですが、ラベルのリストは各リスナーのスコープ外に保持します (この例ではstatic変数を使用するだけですが、フレーム内にラベルのリストを含むフィールドを作成することもできます)。 .

于 2012-05-06T12:06:38.733 に答える