使用JTable AbstractTableModel显示数据

你好,在吗使用JTable AbstractTableModel显示数据,谁会的找我啊,我在这里先谢谢了。

我自己研究swing好多年,有很多组件我都有自己封装的代码,其中JTable我有自己的封装。封装后非常简单,三到4行代码就可以完成数据的创建和添加。并且可以根据内容自适应列宽,调整列宽后记忆宽度,字段列名映射等功能。你如果需要可以联系我发你

如果你不需要封装好的,你可以参考我的DEMO来自己写,这个demo中TableModel也稍微封装了一下。继承的
DefaultTableModel,DefaultTableModel则是继承与AbstractTableModel,很简单,这个例子应该是可以直接运行的。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bin.test;

import com.bin.component.table.TableModel;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

/**
 *
 * @author wydxbg
 */
public class JTableTest extends JFrame {

    public static void main(String[] arg) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JTableTest().setVisible(true);
            }
        });
    }

    public JTableTest() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭的行为
        setPreferredSize(new Dimension(800, 600));//设置组件的大小
        setSize(new Dimension(800, 600));//设置组件的大小
        GridBagLayout layout = new GridBagLayout();//定义网格包布局
        setLayout(layout);//设置布局为网格包布局
        initComponents();//这是初始化组件的代码
        addTableData();//你关心的添加数据代码在这里
    }
    private JScrollPane scrollPane = new JScrollPane();//创建滚动面板
    private JTable table = new JTable();//创建JTABLE
    private TableModel model = new TableModel();//创建TABLE的model

    private void initComponents() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;//网格包拉伸模式为全部,也就是会向上下和左右拉伸
        gbc.weightx = 1d;//X方向拉伸的权重
        gbc.weighty = 1d;//y方向的拉伸权重

        table.setModel(model);//将table的model替换为 TableModel 
        scrollPane.setViewportView(table);//将table添加到滚动面板,这样数据量比较多的时候可以有滚动条
        add(scrollPane, gbc);//添加组件到JFrame 

    }

    private void addTableData() {
        model.addColumn("添加列1");//添加标题
        model.addColumn("添加列2");//添加标题
        
        Object[] value1 = new Object[]{'1','2'};
        model.addRow(value1);//添加数据
        Object[] value2 = new Object[]{'a','b'};
        model.addRow(value2);//添加数据
    }

}





package com.bin.component.table;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.table.DefaultTableModel;
public class TableModel extends DefaultTableModel {

    public TableModel() {
   
    }


    private Map<Integer, Class> columnClass = new HashMap<Integer, Class>();

    public void setColumnClass(int column, Class classType) {
        columnClass.put(column, classType);
    }


    /**
     * 控制指定单元格是否可编辑,目前默认所有的均不可编辑
     *
     * @param row
     * @param column
     * @return
     */
    public boolean isCellEditable(int row, int column) {
        return isCellEditable;
    }
    private boolean isCellEditable = false;

    /*设置表格的每一列均可编辑**/
    public void setAllCellEditable(boolean isEditable) {
        isCellEditable = isEditable;
    }
    //根据列名和行号获取数据
    public String getStringValueAt(int row, String columnName) {
        return getValueAt(row, columnName) == null ? null : getValueAt(row, columnName).toString();
    }
//根据列号和行号获取数据
    public String getStringValueAt(int row, int column) {
        return getValueAt(row, column) == null ? null : getValueAt(row, column).toString();
    }
//根据列名和行号获取数据
    public Object getValueAt(int row, String columnName) {
        for (int i = 0; i < getColumnCount(); i++) {
            if (columnName.equals(getColumnName(i))) {
                return getValueAt(row, i);
            }
        }
        return null;
    }
//根据列号和行号获取数据
    @Override
    public Object getValueAt(int row, int column) {
        if (getRowCount() == 0 || row < 0 || column < 0) {
            return null;
        }
        if(row>=getRowCount()&&column>=getColumnCount()){
            return null;
        }
        Object value;
        if (valueRenders.size() > 0) {
            for (int i = 0; i < valueRenders.size(); i++) {
                if (valueRenders.get(i).index == column) {
                    value = valueRenders.get(i).getValue(super.getValueAt(row, valueRenders.get(i).index));
                    if (value != null) {
                        return value;
                    }
                }

            }
        }
        return super.getValueAt(row, column);
    }


//对指定单元格设置数据
    @Override
    public void setValueAt(Object aValue, int row, int column) {
        if (getRowCount() == 0 || row < 0 || column < 0) {
            return;
        }
        super.setValueAt(aValue, row, column);
    }

    private List<Render> valueRenders = new ArrayList<Render>();

    public void addValueRender(int columnIndex, Map<Object, Object> values) {
        valueRenders.add(new Render(columnIndex, values));
    }

    public class Render {

        private Render(int index, Map<Object, Object> renderValue) {
            this.index = index;
            this.renderValues = renderValue;
        }
        private int index;
        private Map<Object, Object> renderValues = new HashMap<Object, Object>();

        private Object getValue(Object value) {
            if (renderValues == null) {
                return value;
            }
            return renderValues.get(value);
        }

        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(index).append("\n");
            Iterator it = renderValues.keySet().iterator();
            Object key = null;
            while (it.hasNext()) {
                key = it.next();
                sb.append("[").append(key).append("=").append(renderValues.get(key)).append("]");
            }
            return sb.toString();
        }
    }

  

}

 String[] columnNames = {"药物编号","药物名称","俗称","类型(编号或名称)","计量方式","出厂价","销售价","出厂日期","保质期","厂商" };
        Object[][] tableData = {{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""}};
        TableModel model=new DefaultTableModel(tableData,columnNames);//TableModel为AbstractTableModel的子类
        table = new JTable(model);
        table.setRowHeight(30);
        Font ft = new Font("宋体", Font.BOLD, 20);
        //设置表格内容字体
        table.setFont(ft);
        //设置表格字体
        JTableHeader tab_header=table.getTableHeader();//表头
        tab_header.setFont(ft);//设置表头字体
        tab_header.setResizingAllowed(false);//列大小不可改变
        tab_header.setReorderingAllowed(false);//不可整列移动
        //设置表格内容居中
        DefaultTableCellRenderer tcr=new DefaultTableCellRenderer();
        tcr.setHorizontalAlignment(JLabel.CENTER);//设置内容居中显示
        table.setDefaultRenderer(Object.class,tcr);
        JScrollPane csp=new JScrollPane(table);//建立一个带滚动条的容器,把表格加进去
        this.add(csp,BorderLayout.CENTER);//把容器加到Frame窗口里里