如何渲染JTable中的复选框?

tie*_*ndv 5 java checkbox swing jtable

这是我渲染JTable并更改行颜色的代码,但它没有在第6列中显示复选框,只显示字符串(true,false).

你能提供解决方案吗?

提前致谢.

    public class JLabelRenderer extends JLabel implements TableCellRenderer
{
  private MyJTable myTable;
  /**
   * Creates a Custom JLabel Cell Renderer
   * @param t your JTable implmentation that holds the Hashtable to inquire for
   * rows and colors to paint.
   */
  public JLabelRenderer(MyJTable t)
  {
    this.myTable = t;
  }

  /**
   * Returns the component used for drawing the cell.  This method is
   * used to configure the renderer appropriately before drawing.
   * see TableCellRenderer.getTableCellRendererComponent(...); for more comments on the method
   */
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
    setOpaque(true); //JLabel isn't opaque by default

    setText(value.toString());
    setFont(myTable.getFont());

    if(!isSelected)//if the row is not selected then use the custom color
    setBackground(myTable.getRowToPaint(row));
    else //if the row is selected use the default selection color
    setBackground(myTable.getSelectionBackground());

    //Foreground could be changed using another Hashtable...
    setForeground(myTable.getForeground());

    // Since the renderer is a component, return itself
    return this;
  }

  // The following methods override the defaults for performance reasons
  public void validate() {}
  public void revalidate() {}
  protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
  public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
Run Code Online (Sandbox Code Playgroud)

这是表:

import javax.swing.JTable;    
import javax.swing.table.*;
import java.util.Hashtable;
import java.awt.Color;

public class MyJTable extends JTable
{
  Hashtable rowsToPaint = new Hashtable(1);

  /**
   * Default Constructor
   */
  public MyJTable()
  {
    super();
  }

  /**
   * Set the TableModel and then render each column with a custom cell renderer
   * @param tm TableModel
   */
  public void setModel(TableModel tm)
  {
    super.setModel(tm);
    renderColumns(new JLabelRenderer(this));
  }

  /**
   * Add a new entry indicating:
   * @param row the row to paint - the first row = 0;
   * @param bgColor background color
   */
  public void addRowToPaint(int row, Color bgColor)
  {
    rowsToPaint.put(new Integer(row), bgColor);
    this.repaint();// you need to repaint the table for each you put in the hashtable.
  }

  /**
   * Returns the user selected BG Color or default BG Color.
   * @param row the row to paint
   * @return Color BG Color selected by the user for the row
   */
  public Color getRowToPaint(int row)
  {
    Color bgColor = (Color)rowsToPaint.get(new Integer(row));
    return (bgColor != null)?bgColor:getBackground();
  }

  /**
   * Render all columns with the specified cell renderer
   * @param cellRender TableCellRenderer
   */
  public  void renderColumns(TableCellRenderer cellRender)
  {
    for(int i=0; i<this.getModel().getColumnCount(); i++)
    {
      renderColumn(this.getColumnModel().getColumn(i), cellRender);
    }
  }

  /**
   * Render a TableColumn with the sepecified Cell Renderer
   * @param col TableColumn
   * @param cellRender TableCellRenderer
   */
  public void renderColumn(TableColumn col, TableCellRenderer cellRender)
  {
    try{
          col.setCellRenderer(cellRender);
        }catch(Exception e){System.err.println("Error rendering column: [HeaderValue]: "+col.getHeaderValue().toString()+" [Identifier]: "+col.getIdentifier().toString());}
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的屏幕 替代文字

Ada*_*ski 7

解决此问题的最佳方法是实现您自己的TableModel(通常通过子类AbstractTableModel)并实现该getColumnClass(int)方法以返回Boolean.class您希望呈现为的列JCheckBox.

没有必要实现自己TableCellRendererDefaultTableCellRenderer,JTable因为默认情况下,used 会自动将Boolean列呈现为JCheckboxes.


akf*_*akf 4

您可能知道,JTable 会将布尔值呈现为复选框。我认为您的问题是,开箱即用,您无法根据数据中的特定条件设置每行的自定义背景颜色。TableCellRenderer您可以为您的专栏创建一个新的boolean

您有几个选择:

  1. 您可以在当前渲染器中进行测试,以确定value传入的值是否为布尔值,如果是,则配置JCheckbox要返回的实例。这可能会影响您想要的效果,但您需要小心,因为您的渲染器经常被调用,如果您创建一次性的JCheckboxes,则可能会导致大量流失。

  2. 或者,您可以创建一个新的TableCellRenderer扩展JCheckbox(就像您当前的扩展一样JLabel)。您可能希望重构当前的着色逻辑,以便它可以在两个渲染器之间共享。最后,您可能希望将此渲染器与您的列相关联。您可以通过将其设置为表上特定Class( myTable.setDefaultRenderer(Class, TableCellRenderer)) 的默认渲染器,或将其设置为特定列 ( myTable.getColumnModel().getColumn(int).setCellRenderer(TableCellRenderer))的渲染器来执行此操作