Великолепная статья о работе с 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
Однако, проблема в том, что элементы показываются не так:

Я предлагаю следующее решение:
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);
}
Комментариев нет:
Отправить комментарий