Java 获取JTable默认TableCellRenderer并对其进行操作?
我将在JTable中使用许多自定义TableCellRenders,但我不想为每一个都重新创建默认属性,因为我似乎必须从一个普通的JLabel开始。这会产生大量烦人的开销,因为我甚至必须自己填充值,以及匹配的背景、前景、字体等。。。以匹配JTable的其余部分 有没有一种方法可以检索父TableCellRenderer或其结果JLabel并对其进行操作?这样我已经设置了所有的默认值,并且我可以操作我实际更改的属性?我已经用super.getCellRenderer尝试了一切,但它没有给我任何东西来实现这一点 此外,我的TableCellRenderer不是特定于列的。每个单元格都可能不同Java 获取JTable默认TableCellRenderer并对其进行操作?,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我将在JTable中使用许多自定义TableCellRenders,但我不想为每一个都重新创建默认属性,因为我似乎必须从一个普通的JLabel开始。这会产生大量烦人的开销,因为我甚至必须自己填充值,以及匹配的背景、前景、字体等。。。以匹配JTable的其余部分 有没有一种方法可以检索父TableCellRenderer或其结果JLabel并对其进行操作?这样我已经设置了所有的默认值,并且我可以操作我实际更改的属性?我已经用super.getCellRenderer尝试了一切,但它没有给我任何东西
public class ActionTable extends JTable {
...
public TableCellRenderer getCellRenderer(int row, int column) {
String colName = ((ActionTableModel)this.getModel()).getColumnName(column);
if ( colName.equals("CUSTOM COL") ) {
return new ActionCellRenderer(this);
}
return super.getCellRenderer(this.convertRowIndexToModel(row), this.convertColumnIndexToModel(column));
}
public class ActionCellRenderer extends JLabel implements TableCellRenderer {
private ActionTable actionTable;
public ActionCellRenderer(ActionTable actionTable) {
this.actionTable = actionTable;
setOpaque(true); //MUST do this for background to show up.
}
@Override
public Component getTableCellRendererComponent(JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {
int modelRow = actionTable.convertRowIndexToModel(row);
int modelCol = actionTable.convertColumnIndexToModel(column);
String colName = table.getModel().getColumnName(modelCol);
/*
annoying overhead to retrieve default cell renderer properties
to match the rest of the JTable
*/
if (isSelected)
{
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
else
{
setBackground(table.getBackground());
setForeground(table.getForeground());
}
//AND I HAVE TO RETRIEVE THE VALUE MYSELF TOO
String textVal = ((ActionTableModel)table.getModel()).getValueAt(modelRow, modelCol).toString();
this.setHorizontalAlignment(SwingConstants.CENTER);
this.setFont(new Font("Serif", Font.PLAIN, 15));
this.setText(textVal);
//NOW I CAN DO CUSTOMIZATIONS
//PUT CUSTOMIZATIONS HERE
return this;
}只需让ActionCellRenderer扩展DefaultTableCellRenderer并调用getTableCellRenderComponent()方法即可获得JLabel:
public class ActionCellRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column){
//get the label
JLabel label = (JLabel)super.getTableCellRendererComponent(table, value,isSelected, hasFocus,row, column);
//do whatever you want with the label
return label;
}
}
愚蠢的Oracle文档向我展示了如何通过JLabel进行扩展!这个很好用,谢谢!