我又遇到了一个很灵异的现象,我想实现鼠标在JList上的移动的时候记录项会有高亮现象,就象菜单的高亮那种效果,所以我在JList里用setUI(new MyListUI()),这个MyListUI是继承自BasicListUI类的,并重写了paintCell方法,但奇怪的是鼠标指向的记录项没有高亮而该记录的下一项则高亮的了,更神奇的是指到了最后一项时竟然是列表的第一项高亮了,我不明白什么原因
import java.awt.Dimension;import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
public class MainFrame extends JFrame
{
public static void main(String[] args)
{
MainFrame frm = new MainFrame();
}

public MainFrame()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(addList());
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
} public JScrollPane addList()
{
JList list = new JList(addListModel());
list.setUI(new MyListUI());
list.setCellRenderer(new MyListCellRender());
JScrollPane jsp = new JScrollPane(list);
jsp.setPreferredSize(new Dimension(300,400));
return jsp;
}

public DefaultListModel addListModel()
{
DefaultListModel dlm = new DefaultListModel();
for(int i=0;i<100;i++)
dlm.addElement(i+"-"+System.currentTimeMillis());
return dlm;
}
}
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;import javax.swing.JComponent;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.MouseInputListener;
import javax.swing.plaf.basic.BasicListUI;public class MyListUI extends BasicListUI
{
private Point point = new Point();
private JComponent com; public void installUI(JComponent c)
{
super.installUI(c);
this.com = c;
} protected MouseInputListener createMouseInputListener()
{
return new MouseInputHandler()
{
public void mouseMoved(MouseEvent e)
{
point = e.getPoint();
com.repaint();
}
};
} protected void paintCell(Graphics g, int row, Rectangle rowBounds, ListCellRenderer cellRenderer, ListModel dataModel, ListSelectionModel selModel, int leadIndex)
{
super.paintCell(g, row, rowBounds, cellRenderer, dataModel, selModel, leadIndex);
MyListCellRender render = (MyListCellRender)cellRenderer;
render.setMouseOver(rowBounds.contains(point));
}}
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
public class MyListCellRender extends JLabel implements ListCellRenderer
{
private boolean mouseOver;
private Color bgColor;

public Component getListCellRendererComponent(JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus)
{
this.setText(value.toString());
bgColor = isSelected?new Color(0,200,255):Color.white;
return this;
} protected void paintComponent(Graphics g)
{
if(mouseOver)
{
bgColor = new Color(255,240,200);
}
g.setColor(bgColor);
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}

public void setMouseOver(boolean mouseOver)
{
this.mouseOver = mouseOver;
}}