xbgd 发表于 2013-2-4 20:00:04

Swing JTable高级使用-如何增加checkbox组件

package components;

/*
* TableRenderDemo.java requires no other files.
*/

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

/**
* TableRenderDemo is just like TableDemo, except that it
* explicitly initializes column sizes and it uses a combo box
* as an editor for the Sport column.
*/
public class TableRenderDemo extends JPanel {
    private boolean DEBUG = true;
    public TableRenderDemo(){
    super(new GridLayout(1,0));
    JTable table = new JTable(new MyTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500,70));
   //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);
    //Set up column sizes
    initColumnSizes(table);
      //Fiddle with the Sport column's cell editors/renderers.
    setUpSportColumn(table,table.getColumnModel().getColumn(1));
    //Add the scroll pane to this panel
    add(scrollPane);
    }

   /*
   * This method picks good column sizes.
   * If all column heads are wider than the column's cells'
   * contents, then you can just use column.sizeWidthToFit().
   */
    private void initColumnSizes(JTable table){
    MyTableModel model = (MyTableModel)table.getModel();
    TableColumn column = null;
    Component comp = null;
    int headerWidth = 0;
    int cellWidth = 0;
    Object [] longValues = model.longValues;
    TableCellRenderer headerRenderer =
       table.getTableHeader().getDefaultRenderer();
    for(int i = 0;i < table.getColumnCount();i++){
       column = table.getColumnModel().getColumn(i);
       comp = headerRenderer.getTableCellRendererComponent(
            null, column.getHeaderValue(),
            false, false, 0, 0);
       headerWidth = comp.getPreferredSize().width;
       comp = table.getDefaultRenderer(
         model.getColumnClass(i)).getTableCellRendererComponent(
         table, longValues,
         false, false, 0, i);
       cellWidth = comp.getPreferredSize().width;

            if(DEBUG){
            System.out.println("Initializing width of column "
                   + i +"."
                   +"headerWidth = "+headerWidth
                   +"cellWidth = "+cellWidth);
            }
            column.setPreferredWidth(Math.max(headerWidth, cellWidth));

      }
    }

    public void setUpSportColumn(JTable table,
            TableColumn sportColumn){
   
    JComboBox comboBox = new JComboBox();
    comboBox.addItem("java");
    comboBox.addItem(".NET");
    comboBox.addItem("C++");
    comboBox.addItem("JSP");
    comboBox.addItem("PHP");
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox));


      //Set up tool tips for the sport cells.
    DefaultTableCellRenderer renderer =
      new DefaultTableCellRenderer();
      renderer.setToolTipText("Click for combo box");
      sportColumn.setCellRenderer(renderer);

    }

    class MyTableModel extends AbstractTableModel {
      private String[] columnNames = {"姓名",
                                        "专业",
                                        "工龄",
                                        "健在"};
      private Object[][] data = {
         {"吕振","java",new Integer(3),new Boolean(true)},
   {"张沛",".NET",new Integer(4),new Boolean(true)},
   {"岳飞","weapon",new Integer(100),new Boolean(false)},
       {"张艺谋","film",new Integer(50),new Boolean(true)}
      };
      public final Object[] longValues = {"吕振","None of the above",
                  new Integer(29),Boolean.TRUE};

      public int getColumnCount() {
            return columnNames.length;
      }

      public int getRowCount() {
            return data.length;
      }

      public String getColumnName(int col) {
            return columnNames;
      }

      public Object getValueAt(int row, int col) {
            return data;
      }

       /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell. If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
      public Class getColumnClass(int c) {
      //实现了如果是boolean自动转成JCheckbox
      /*需要自己的celleditor这么麻烦吧。jtable自动支持Jcheckbox,
      * 只要覆盖tablemodel的getColumnClass返回一个boolean的class,
      * jtable会自动画一个Jcheckbox给你,
      * 你的value是true还是false直接读table里那个cell的值就可以*/
      System.out.println("=============="+getValueAt(0, c).getClass());
            return getValueAt(0, c).getClass();
      }

       /*
         * Don't need to implement this method unless your table's
         * editable.
         */
      public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
      }

      /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
      public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                 + " to " + value
                                 + " (an instance of "
                                 + value.getClass() + ")");
            }

            data = value;
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
      }

      private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                  System.out.print(" " + data);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
      }
    }

   /**
   * Create the GUI and show it. For thread safety,
   * this method should be invoked from the
   * event-dispatching thread.
   */
    private static void createAndShowGUI() {
       //Create and set up the window.
      JFrame frame = new JFrame("TableRenderDemo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       //Create and set up the content pane.
      TableRenderDemo newContentPane = new TableRenderDemo();
      newContentPane.setOpaque(true); //content panes must be opaque
      frame.setContentPane(newContentPane);

       //Display the window.
      frame.pack();
      frame.setVisible(true);
    }

    public static void main(String[] args) {
      //Schedule a job for the event-dispatching thread:
      //creating and showing this application's GUI.
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
      });
    }
}
页: [1]
查看完整版本: Swing JTable高级使用-如何增加checkbox组件