listcellrenderer problem

listcellrenderer problem
AT
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
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.

Kopiuj
 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
		
	}	
}
remigio
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 9 lat
  • Postów:357
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...

Kopiuj
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ć ?:)

edytowany 2x, ostatnio: remigio
AT
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

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

AT
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

Najprostsza wersja wyglada tak:

Kopiuj
 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();
		}
	}
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.