Java 获取JTable默认TableCellRenderer并对其进行操作?

Java 获取JTable默认TableCellRenderer并对其进行操作?,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我将在JTable中使用许多自定义TableCellRenders,但我不想为每一个都重新创建默认属性,因为我似乎必须从一个普通的JLabel开始。这会产生大量烦人的开销,因为我甚至必须自己填充值,以及匹配的背景、前景、字体等。。。以匹配JTable的其余部分 有没有一种方法可以检索父TableCellRenderer或其结果JLabel并对其进行操作?这样我已经设置了所有的默认值,并且我可以操作我实际更改的属性?我已经用super.getCellRenderer尝试了一切,但它没有给我任何东西

我将在JTable中使用许多自定义TableCellRenders,但我不想为每一个都重新创建默认属性,因为我似乎必须从一个普通的JLabel开始。这会产生大量烦人的开销,因为我甚至必须自己填充值,以及匹配的背景、前景、字体等。。。以匹配JTable的其余部分

有没有一种方法可以检索父TableCellRenderer或其结果JLabel并对其进行操作?这样我已经设置了所有的默认值,并且我可以操作我实际更改的属性?我已经用super.getCellRenderer尝试了一切,但它没有给我任何东西来实现这一点

此外,我的TableCellRenderer不是特定于列的。每个单元格都可能不同

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进行扩展!这个很好用,谢谢!