listcellrenderer problem

Odpowiedz Nowy wątek
2011-07-14 00:15
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
 
    }   
}

Pozostało 580 znaków

2011-07-14 19:24
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ć ?:)

edytowany 2x, ostatnio: remigio, 2011-07-14 21:48

Pozostało 580 znaków

2011-07-14 23:17
0

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

Pozostało 580 znaków

2011-07-15 20:36
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();
        }
    }
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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