四种方法JTable兑现总结

四种方法JTable实现总结以下四种实现JTable均已测试,拷贝代码可运行 import java.awt.BorderLayoutimport

四种方法JTable实现总结

以下四种实现JTable均已测试,拷贝代码可运行

 

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableRowSorter;
public class ComTable extends JFrame implements ActionListener, ListSelectionListener {
 private static final long serialVersionUID = 1L;
 private Object[][]data = new Object[][]{{"阿呆",66,32,98,false},{"阿痴",82,69,128,true}};
 private String[]title = new String[]{"姓名","语文","数学","总分","及格"};
 private DefaultTableModel model = null;
 private JTable tab = null;
 private ListSelectionModel selNode = null;
 private JButton oper = null;
 private JPanel north = null;
 private JLabel msg = null;
 private TableRowSorter<DefaultTableModel>sort = null;
 private JTextField rex = null;
 public static void main(String[] args) {
  new ComTable(1);
  new ComTable(2);
  new ComTable(3);
  new ComTable(4);
 }
 public ComTable(int type) {
  if(type==1){
   this.setTitle("监听表格");
   north = new JPanel(new FlowLayout(FlowLayout.CENTER));
   oper = new JButton("设置单选");
   oper.addActionListener(this);
   north.add(oper);
   oper = new JButton("设置多选");
   oper.addActionListener(this);
   north.add(oper);
   oper = new JButton("增加行");
   oper.addActionListener(this);
   north.add(oper);
   oper = new JButton("增加列");
   oper.addActionListener(this);
   north.add(oper);
   oper = new JButton("删除行");
   oper.addActionListener(this);
   north.add(oper);
   oper = new JButton("删除列");
   oper.addActionListener(this);
   north.add(oper);
   this.getContentPane().add(north,BorderLayout.NORTH);
   model = new DefaultTableModel(data,title);
   tab = new JTable(model);
   tab.setPreferredScrollableViewportSize(new Dimension(550,30));
   tab.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
   for(int i=0;i<tab.getColumnCount();i++){
    TableColumn col = tab.getColumnModel().getColumn(i);
    col.setPreferredWidth(((i%2)==0)?150:50);
   }
   selNode = tab.getSelectionModel();
   selNode.addListSelectionListener(this);
   this.getContentPane().add(new JScrollPane(tab),BorderLayout.CENTER);
   msg = new JLabel(" ");
   this.getContentPane().add(msg,BorderLayout.SOUTH);
  }else if(type==2){
   this.setTitle("模型表格");
   tab = new JTable();
   tab.setModel(new TModel(data,title));
   this.getContentPane().add(new JScrollPane(tab),BorderLayout.CENTER);
  }else if(type==3){
   this.setTitle("集合表格");
   this.init();
   this.getContentPane().add(new JScrollPane(tab),BorderLayout.CENTER);
  }else if(type==4){
   this.setTitle("表格排序与过滤");
   String[][]data = new String[][]{{"China","Beijing","Chinese"},{"America","Washington","English"},{"Germany","Berlin","German"},
     {"Korea","Seoul","Korean"},{"Japan","Tokyo","Japanese"},{"France","Paris","French"},{"England","London","English"}};
   String[]title = new String[]{"Country","Capital","Language"};
   JScrollPane jsp = new JScrollPane();
   model = new DefaultTableModel(data,title);
   tab = new JTable(model);
   sort = new TableRowSorter<DefaultTableModel>(model);
   tab.setRowSorter(sort);
   jsp.setViewportView(tab);
   this.getContentPane().add(jsp,BorderLayout.CENTER);
   JPanel south = new JPanel();
   south.setLayout(new BoxLayout(south,BoxLayout.X_AXIS));
   south.add(new JLabel("过滤规则:"));
   rex = new JTextField();
   south.add(rex);
   oper = new JButton("执行");
   oper.addActionListener(this);
   south.add(oper);
   this.getContentPane().add(south,BorderLayout.SOUTH);
  }
  this.pack();
  this.setBounds(200,200,700,400);
  this.setResizable(false);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setVisible(true);
 }
 @Override
 public void actionPerformed(ActionEvent e) {
  if(e.getActionCommand().equals("设置单选")){
   selNode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }else if(e.getActionCommand().equals("设置多选")){
   selNode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
  }else if(e.getActionCommand().equals("增加列")){
   model.addColumn("新列");
  }else if(e.getActionCommand().equals("增加行")){
   model.addRow(new Vector<Object>());
  }else if(e.getActionCommand().equals("删除列")){
   int index = model.getColumnCount()-1;
   if(index>=0){
    TableColumnModel cols = tab.getColumnModel();
    cols.removeColumn(cols.getColumn(index));
    model.setColumnCount(index);
   }
  }else if(e.getActionCommand().equals("删除行")){
   int row = model.getRowCount()-1;
   if(row>=0){
    model.removeRow(row);
    model.setRowCount(row);
   }
  }else if(e.getActionCommand().equals("执行")){
   if(rex.getText().length()<=0){
    sort.setRowFilter(null);
   }else{
    sort.setRowFilter(RowFilter.regexFilter(rex.getText()));
   }
  }
  tab.revalidate();
 }
 @Override
 public void valueChanged(ListSelectionEvent e) {
  StringBuffer info = new StringBuffer("被选坐标与值:");
  int[]rows = tab.getSelectedRows();
  int[]cols = tab.getSelectedColumns();
  for(int i=0;i<rows.length;i++){
   for(int j=0;j<cols.length;j++){
    Object val = tab.getValueAt(rows[i],cols[j]);
    info.append("[("+rows[i]+","+cols[j]+"),"+((val==null)?"空值":val.toString())+"] ");
   }
  }
  msg.setText(info.toString());
 }
 private void init(){
  Vector<Vector<String>>rows = new Vector<Vector<String>>();
  Vector<String>row = new Vector<String>();
  row.add("200921240121");
  row.add("娄满朝");
  row.add("男");
  row.add("24");
  row.add("湖北省麻城市");
  row.add("信息与计算科学");
  rows.add(row);
  Vector<String>title = new Vector<String>();
  title.add("学号");
  title.add("名字");
  title.add("性别");
  title.add("年龄");
  title.add("籍贯");
  title.add("专业");
  tab = new JTable(rows,title);
 }
}
class TModel extends AbstractTableModel {
 private static final long serialVersionUID = 1L;
 private Object[][]data = null;
 private String[]title = null;
 public TModel(Object[][]data,String[]title) {
  this.data = data;
  this.title = title;
 }
 @Override
 public String getColumnName(int col) {
  return title[col];
 }
 @Override
 public int getColumnCount() {
  return title.length;
 }
 @Override
 public int getRowCount() {
  return data.length;
 }
 @Override
 public Object getValueAt(int row, int col) {
  return data[row][col];
 }
 @Override
 public void setValueAt(Object val, int row, int col) {
  data[row][col] = val;
  this.fireTableCellUpdated(row,col);
 }
 @Override
 public Class<? extends Object> getColumnClass(int c) {
  return this.getValueAt(0,c).getClass();
 }
 @Override
 public boolean isCellEditable(int row, int col) {
  return true;
 }
}