piaoyiren 2021-09-11 17:53 采纳率: 58.8%
浏览 85
已结题

使用JTable AbstractTableModel显示数据

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

  • 写回答

2条回答 默认 最新

  • 唯一的小彬哥 2021-09-14 15:27
    关注

    我自己研究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();
            }
        }
    
      
    
    }
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 9月19日
  • 赞助了问题酬金 9月11日
  • 创建了问题 9月11日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图