2010-09-13 82 views
1

我有一個JPanel內的,它位於JFrame的內部。我使用添加JLabels for循環穿過顏色的陣列迭代:多個JLabel上的MouseListener不能按預期工作

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; 
} 

這產生5 JLabels,與分配給每個相同ImageIcon,橫跨JPanel水平方向擴展。每個人都有一個MouseListener添加到它,但只有最後添加的標籤觸發事件。

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

我具有涉及含有ImageIcon尾隨我的光標的標籤,其停止次要問題,當我鼠標移到任何5個標籤。我想這是一個圖層索引問題,但無法解決它。

任何與這些幫助非常感謝謝謝!

+1

究竟是什麼問題?您的鼠標偵聽器只會在最後一個標籤被點擊時發出嗶嗶聲,因爲這是您設置的目標。代碼遠離SSCCE,順便說一句。 – 2010-09-13 15:51:13

+0

質量差的代碼道歉 - 我剛剛開始在軟件開發。我現在看到我的邏輯存在缺陷,謝謝。有關我如何參考它的任何想法,以便點擊時任何標籤都會發出蜂鳴聲? – Frank 2010-09-13 16:18:50

+1

擺脫'e.getSource()。equals(target)'部件,或者存儲一個JLabel數組並循環遍歷它們,檢查它們是否是目標。 – 2010-09-13 16:20:35

回答

2

您的mouseClicked(MouseEvent evt)方法只檢查事件來源是否爲單個組件(目標),正如傑弗裏指出的那樣,它是您添加的最後一個標籤。嘗試將此添加爲您的mouseClicked方法中的第一行。

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

注:未經測試。希望Color有一個很好的toString()實現。
注2:如果您將類作爲鼠標偵聽器添加到任何其他組件,則可能會得到ClassCastException