簡體   English   中英

如何渲染JTable中的復選框?

[英]How to render a checkbox in a 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) {}
}

這是表:

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());}
  }
}

這是我的屏幕 替代文字

解決此問題的最佳方法是實現自己的TableModel (通常通過對AbstractTableModel進行子類化)並實現getColumnClass(int)方法,以返回要作為JCheckBox呈現的列的Boolean.class

沒有必要實現自己的TableCellRenderer因為默認情況下JTable使用的DefaultTableCellRenderer會自動將Boolean列呈現為JCheckbox

您可能知道,JTable會將布爾值作為復選框呈現給您。 我認為您的問題是,開箱即用,您無法根據數據中的特定條件為每行設置自定義背景顏色。 您可以為boolean列創建一個新的TableCellRenderer

你有幾個選擇:

  1. 您可以在當前渲染器中放置一個測試,以確定傳入的value是否為布爾值,如果是,則配置要返回的JCheckbox實例。 這可能會影響您的需求,但您需要小心,因為您的渲染器經常被調用,如果您創建一次性JCheckbox ,它可能會導致大量的流失。

  2. 或者,您可以創建一個擴展JCheckbox的新TableCellRenderer (就像您當前擴展JLabel 。您可能希望重構當前的着色邏輯,以便它可以在兩個渲染器之間共享。最后,您可能希望將此渲染器與您可以通過將其設置為某個ClassmyTable.setDefaultRenderer(Class, TableCellRenderer) )的表上的默認渲染器,或將其設置為特定列( myTable.getColumnModel().getColumn(int).setCellRenderer(TableCellRenderer)的渲染器來執行此操作myTable.getColumnModel().getColumn(int).setCellRenderer(TableCellRenderer)

謝謝akf我解決了它:

添加類:

public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {

          CheckBoxRenderer() {
            setHorizontalAlignment(JLabel.CENTER);
          }

          public Component getTableCellRendererComponent(JTable table, Object value,
              boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
              setForeground(table.getSelectionForeground());
              //super.setBackground(table.getSelectionBackground());
              setBackground(table.getSelectionBackground());
            } else {
              setForeground(table.getForeground());
              setBackground(table.getBackground());
            }
            setSelected((value != null && ((Boolean) value).booleanValue()));
            return this;
          }
}

編輯Mytable的構造函數:

 public MyJTable(DefaultTableModel md)
  {
    super(md);
    CheckBoxRenderer checkBoxRenderer = new CheckBoxRenderer();
    this.getColumnModel().getColumn(6).setCellRenderer(checkBoxRenderer);
  }

我覺得使用Table Row Rendering方法更容易。 它可以在不為每列創建單獨的渲染器的情況下工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM