四种方法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;
}
}
