listcellrenderer problem

0

Mam JList i chce uzyskać prosty efekt. Po najechaniu kursorem nad dany element jego tlo ma sie zmienic. napisalem cos takiego ale nie chce to niestety dzialac.

 class MyCellRenderer extends JLabel implements ListCellRenderer, MouseListener {
	private static final long serialVersionUID = 1L;

	@Override
	public Component getListCellRendererComponent(JList list, 
											      Object value,
											      int index, 
											      boolean isSelected,
											      boolean cellHasFocus) {
		setBackground(Color.green);
		setIcon(new ImageIcon("obrazek.jpg"));
		setText("<html>t<br>t2</html>");
		setOpaque(true);
		return this;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		setBackground(Color.red);	
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}	
}
0

musisz pobierać punkty w których znajduje się aktualnie kursor...np.
Point p = new Point(e.getX(), e.getY());
później wybierasz dany index przez setSelectedIndex(list.locationToIndex(p));

a tutaj masz programik który zaznacza zadane pole...

class Main extends DefaultListCellRenderer {

    private static final long serialVersionUID = 1L;

    public Component getListCellRendererComponent(final JList list,
            Object value,
            final int index,
            boolean isSelected,
            boolean cellHasFocus) {
        setText(value.toString());
        class M extends MouseAdapter {
            public void mouseEntered(MouseEvent e) {
                Point p = new Point(e.getX(), e.getY());
                list.setSelectedIndex(list.locationToIndex(p)); 
                if (index == list.locationToIndex(p)) {
                    setBackground(Color.red);
                }
            }
        }
        list.addMouseListener(new M());
        return this;
    }

    public static void main(String[] args) {
        JFrame fr = new JFrame("JList");
        JList list = new JList(new Object[]{"a", "b", "c", "d"});
        list.setCellRenderer(new Main());
        fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        fr.add(list);
        fr.setSize(300, 300);
        fr.setVisible(true);
    }
}
 

jednakże działa on tak że jak najadę kursorem na pierwsze - zapali się pierwsze pole(na czerwono). Potem jak najadę na ostatnie to zaznaczają się wszystkie...
Może wie ktoś jak to usprawnić ?:)

0

Poradziłem sobie z tym i działa bez problemu jutro wstawie kod jakbyś chciał zobaczyc zapewne nie jest idealnie ale dziala.

0

Najprostsza wersja wyglada tak:

 class MyCellRenderer extends JLabel implements ListCellRenderer {
	private static final long serialVersionUID = 1L;
	private JList list        = null;
	private int cellIndex     = -1;
	private boolean exited    = false;
	private Color activeColor = Color.RED;
	private Color hideColor   = Color.GREEN;
	
	@Override
	public Component getListCellRendererComponent(JList list, 
											      Object value,
											      int index, 
											      boolean isSelected,
											      boolean cellHasFocus) {
		this.list = list;
		
//		Album album = (Album)value;
		setText(value);
		
//		setIcon(new ImageIcon(album.image));
		
		if(index == cellIndex)                setBackground(activeColor);
		else if(index != cellIndex || exited) setBackground(hideColor);

		setOpaque(true);
		return this;
	}	
	class mouseMovedEvent extends MouseAdapter {

		@Override
		public void mouseMoved(MouseEvent e) {
			exited = false;
			cellIndex = list.locationToIndex(e.getPoint());
			list.repaint();
		}
	}
	class mouseExitedEvent extends MouseAdapter {

		@Override
		public void mouseExited(MouseEvent e) {
			exited = true;
			cellIndex = -1;
			list.repaint();
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1