1

JLabelsの中に5つJPanelありJFrameます。JLabels色の配列を反復処理するforループを使用して追加しています。

private JLabel target;

// This is the origin of the first label added.
Point origin = new Point(10, 20);

// This is the offset for computing the origin for the next label.
int offset = 200;

for (int i = 0; i < layerColors.length; i++) {
    target = createColoredLabel(layerColors[i], origin, targetIcon);
    layeredPane.add(target, new Integer(i));
    origin.x += offset;
}

// Create and set up a colored label with icon image.
private JLabel createColoredLabel(Color color, Point origin, ImageIcon icon) {
    JLabel label = new JLabel(icon);
    label.setVerticalAlignment(JLabel.TOP);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setOpaque(true);
    label.setBackground(color);
    label.setBorder(BorderFactory.createLineBorder(Color.black));
    label.setBounds(origin.x, origin.y, 175, 263);
    label.addMouseListener(this);

    return label;
}

これによりJLabels、それぞれに同じものがImageIcon割り当てられた5が作成され、全体に水平方向に広がりJPanelます。それぞれにMouseListener追加されていますが、最後に追加されるラベルのみがイベントをトリガーします。

@Override
public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(target)) {
        Toolkit.getDefaultToolkit().beep();
    }
}

ImageIcon5つのラベルのいずれかにマウスを合わせると停止する、カーソルの末尾を含むラベルに関する2番目の問題があります。レイヤーのインデックス作成の問題だと思いますが、解決できません。

これらの助けは大歓迎です!

4

1 に答える 1

2

このメソッドmouseClicked(MouseEvent evt)は、イベントソースが単一のコンポーネント(ターゲット)であるかどうかを確認するだけです。これは、Geoffreyが指摘しているように、最後に追加したラベルです。これをメソッドの最初の行として追加してみてくださいmouseClicked

System.out.println("Color: " + ((JLabel)evt.getSource()).getBackground());

注:テストされていません。うまくいけば、Colorには素晴らしいtoString()実装があります。
注2:ClassCastExceptionクラスをマウスリスナーとして他のコンポーネントに追加すると、が表示される場合があります。

于 2010-09-13T16:16:58.950 に答える