JTable行选择背景问题。

我有一个JTable并在JTable和其他属性中设置图片作为背景我使用了这段代码。

tblMainView= new JTable(dtModel){ public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer( renderer, row, column); // We want renderer component to be transparent so background image // is visible if( c instanceof JComponent ) ((JComponent)c).setOpaque(false); return c; } ImageIcon image = new ImageIcon( "images/watermark.png" ); public void paint( Graphics g ) { // First draw the background image - tiled Dimension d = getSize(); for( int x = 0; x < d.width; x += image.getIconWidth() ) for( int y = 0; y  getPreferredSize().width); } } return false; } }; tblMainView.setOpaque(false); 

一切都正常。 但是当我选择一行时,行数据会隐藏。它会显示我的行 这个

我希望结果像这样, 在此处输入图像描述 dtModel是我的JTabledeafultTableModel ,名为tblMainView

覆盖prepareRenderer()是一种为整个表行进行自定义渲染的推荐方法,但是你不能让它做任何事情。 特别是, Icon的默认渲染器应该做你想要的,并且根本没有理由覆盖paint()

附录:仔细观察,您选择的字段显示为空,因为setOpaque(false)干扰DefaultTableCellRenderer API中提到的优化。 您复制的示例将不起作用。

作为参考,下面的示例将覆盖DefaultTableModelgetColumnClass() ,以获取类型IconDate的默认渲染器 。

Java GUI

 import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.util.Calendar; import java.util.Date; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; /** @see https://stackoverflow.com/questions/6873665 */ public class JavaGUI extends JPanel { private static final int ICON_COL = 0; private static final int DATE_COL = 1; private static final Icon icon = UIManager.getIcon("Tree.closedIcon"); private final Calendar calendar = Calendar.getInstance(); public JavaGUI() { CustomModel model = new CustomModel(); JTable table = new JTable(model) { @Override public Component prepareRenderer( TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); if (isRowSelected(row)) { c.setBackground(Color.blue); } else { c.setBackground(Color.white); } return c; } }; for (int i = 1; i <= 16; i++) { model.addRow(newRow(i)); } this.add(table); } private Object[] newRow(int i) { calendar.add(Calendar.DAY_OF_YEAR, 1); return new Object[]{icon, calendar.getTime()}; } private static class CustomModel extends DefaultTableModel { private final String[] columnNames = {"Icon", "Date"}; @Override public Class getColumnClass(int col) { if (col == ICON_COL) { return Icon.class; } else if (col == DATE_COL) { return Date.class; } return super.getColumnClass(col); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public boolean isCellEditable(int row, int column) { return false; } } private void display() { JFrame f = new JFrame("JavaGUI"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new JavaGUI().display(); } }); } }