大家运行下下面的代码,你会发现在 JScrollPane 中的 JLabel 只有最后一个 label 才会响应 MouseListener 中的 mouseEntered 方法中的 setBackground 事件,这是为什么呢?
public class TestScroll2 extends JFrame{ JPanel panel = new JPanel();
JScrollPane pane = null;
JTextField field = new JTextField();
JButton button = new JButton("aa");
JLabel label = null;
Vector<JLabel> v = new Vector<JLabel>();
public TestScroll2(){
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
for(int i = 0; i < 10; i++){
label = new JLabel("abcde" + i);
label = (JLabel)MyTestPopup.setAbsolutelySize(label, new Dimension(100, 20));
label.setOpaque(true);
label.setBackground(Color.white);
label.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
field.setText(((JLabel)e.getSource()).getText());
pane.setVisible(false);
}
public void mouseEntered(MouseEvent e){
label.setBackground(Color.BLUE);
}
public void mouseExited(MouseEvent e){
label.setBackground(Color.WHITE);
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
});
}
for(int i = 0; i < v.size(); i++){
panel.add(v.get(i));
}
pane = new JScrollPane(panel);
pane = (JScrollPane)setAbsolutelySize(pane, new Dimension(120, 100));
pane.setLocation(0, 0);
this.setLayout(null);
this.add(pane);
button = (JButton)setAbsolutelySize(button, new Dimension(50, 20));
button.setLocation(0, 110);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(pane.isValid()){
pane.setVisible(false);
}else{
pane.setVisible(true);
}
}
});
this.add(button);
field = (JTextField)setAbsolutelySize(field, new Dimension(100, 20));
field.setLocation(0, 135);
this.add(field);
}

public static Component setAbsolutelySize(Component c, Dimension size){
c.setSize(size);
c.setPreferredSize(size);
c.setMaximumSize(size);
c.setMinimumSize(size);
return c;
}
public static void main(String[] args){
SwingConsole.run(new TestScroll2(), 350, 200, "");
}
}

解决方案 »

  1.   

    第一个for循环中为什么没有v.add(label)?
    循环了10次,每次都用label指向一个新的Jlabel,旧的不是就丢掉了吗?
      

  2.   

    是啊,LZ你忘了把创建的JLabel加到你的Vector里面去了吧,我看你后面有 
    for(int i = 0; i < v.size(); i++)
    {
         panel.add(v.get(i));
    }
      

  3.   

    for(int i = 0; i < 10; i++){
                label = new JLabel("abcde" + i);
            .......
    }
    循环修改label,其实就是最后一个有效