〔Java〕关于JTable的Renderer

〔Java〕关于JTable的Renderer

import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.DefaultCellEditor;

import javax.swing.event.ChangeEvent;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import javax.swing.table.TableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;


public class WhoFirstTest
{
  public static void main( String[]args )
  {
    final Object[][] data=new Object[][]{ { "11", new Integer( 1 ) }, { "22", new Integer( 2 ) } };

    final String[] header=new String[]{ "表头1", "表头2" };

    Table table=new Table( new BaseModel( data, header ) );

    JTextField editor=new JTextField();
    editor.setBorder( null );
    table.setDefaultEditor( Object.class, new BaseEditor( editor ) );

    table.setDefaultRenderer( Object.class, new BaseRenderer() );

    table.getModel().addTableModelListener( new TableModelListener()
    {
      public void tableChanged( TableModelEvent e )
      {
        System.out.println( "tableChanged called" );
        /*/
        System.out.println( "FirstRow="+e.getFirstRow() );
        System.out.println( "LastRow="+e.getLastRow() );
        System.out.println( "Column="+e.getColumn() );
        System.out.println( "Type="+( ( e.getType()==TableModelEvent.INSERT ) ? "Insert" : ( e.getType()==TableModelEvent.UPDATE ) ? "Update" : ( e.getType()==TableModelEvent.DELETE ) ? "Delete" : "Unknow" ) );
        /*/
        //Do CRUD for DB ...
        //*/
      }
    } );

    JFrame frame=new JFrame( "看看给单元格赋值的顺序" );
    frame.setContentPane( new JScrollPane( table ) );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible( true );
  }
}


class Table extends JTable
{
  public Table( TableModel model )
  {
    super( model );
  }

  public void editingStopped( ChangeEvent e )
  {
    System.out.println( "editingStopped called" );
    super.editingStopped( e );
  }

  public Component prepareRenderer( TableCellRenderer renderer, int row, int column )
  {
    System.out.println( "prepareRenderer called" );
    return super.prepareRenderer( renderer, row, column );
  }
}


class BaseModel extends AbstractTableModel
{
  Object[][] data = null;
  Object[] header = null;

  public BaseModel( Object[][] data, Object[] header )
  {
    this.data   = data;
    this.header = header;
  }

  public String getColumnName( int column )
  {
    return header[column].toString();
  }

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

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

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

  public boolean isCellEditable( int row, int column )
  {
    return true;
  }

  public void setValueAt( Object value, int row, int col )
  {
    System.out.println( "setValueAt called" );
    data[row][col]=value;
    fireTableCellUpdated( row, col );
  }

  public void fireTableCellUpdated( int row, int column )
  {
    super.fireTableCellUpdated( row, column );
    System.out.println( "fireTableCellUpdated called" );
  }

  public void fireTableChanged( TableModelEvent e )
  {
    super.fireTableChanged( e );
    System.out.println( "fireTableChanged called" );
  }
}


class BaseRenderer extends DefaultTableCellRenderer
{
  public BaseRenderer()
  {
    super();
  }

  public Component getTableCellRendererComponent( JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  boolean hasFocus,
                                                  int row,
                                                  int column )
  {
    System.out.println( "BaseRenderer called" );

    setText( ( value==null ) ? "" : value.toString() );

    return this;
  }
}


class BaseEditor extends DefaultCellEditor
{
  public BaseEditor( JTextField editor )
  {
    super( editor );
  }

  public boolean stopCellEditing()
  {
    System.out.println( "stopCellEditing called" );

    String value=(String)getCellEditorValue();

    try{ Integer.parseInt( value );
       }
    catch( NumberFormatException e )
         {
           this.editorComponent.requestFocus();
           return false;
         }

    return super.stopCellEditing();
  }
}

你可能感兴趣的:(〔Java〕关于JTable的Renderer)