пятница, 5 августа 2011 г.

JTable - rows with image

Великолепная статья о работе с JTable:
http://javanepal.wordpress.com/2010/06/30/adding-jlabel-in-jtable/

For adding icon on JTable you can simply add a line of code in your Renderer.
I’ve just added one line code in the above DefaultTableCellRender extended class i.e. Renderer

class ImageRenderer extends DefaultTableCellRenderer
{
    JLabel lbl = new JLabel();

    URL imageURL = getClass().getClassLoader().getResource("resources/jpg.png");
    ImageIcon imageicon = new ImageIcon(imageURL);

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        lbl.setText((String) value);
        lbl.setIcon(imageicon);
        return lbl;
    }
}

//....
JpgWrongList.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());








Однако, проблема в том, что элементы показываются не так:
  •  на эти строчки невозможно установить фокус (вернее он устанавливается, но не отображается)
  •  элементы выделены жирным 
Вообще, конечно, в идеале ожидалось поведение как в Windows:

Я предлагаю следующее решение:
class ImageRenderer extends DefaultTableCellRenderer
{
    JLabel lbl = new JLabel();

    URL imageURL = getClass().getClassLoader().getResource("resources/jpg.png");
    ImageIcon imageicon = new ImageIcon(imageURL);

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        lbl.setText((String) value);
        lbl.setIcon(imageicon);
        lbl.setOpaque(true); // прозрачность!
        Font newLabelFont=new Font(lbl.getFont().getName(),Font.PLAIN,lbl.getFont().getSize());  
        lbl.setFont(newLabelFont); 

        if (isSelected)
        {
            lbl.setBackground(table.getSelectionBackground());
        } else
        {
            lbl.setBackground(table.getBackground());
        }
        return lbl;
    }
}
Результат:

Вообще говоря, это еще не всё. Кроме статуса isSelected должен обрабатываться статус hasFocus.


if (hasFocus) 
  {
    lbl.setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
  }
else
  {
    lbl.setBorder(noFocusBorder);
  }

Комментариев нет:

Отправить комментарий