Java图形化界面编程超详细知识点(10)——Swing_表格

目录

7 JTable、TableModel实现表格

7.1 创建简单表格

7.2 TableModel


7 JTable、TableModel实现表格

        表格也是GUI程序中常用的组件,表格是一个由多行、多列组成的二维显示区。Swing的JTable以及相关类提供了这种表格支持,通过使用JTable以及相关类,程序既可以使用简单的代码创建表格来显示二维数据,也可以开发出功能丰富的表格,还可以为表格定制各种显式外观,编辑特性。

7.1 创建简单表格

使用JTable创建简单表格步骤:

        1.创建一个一维数组,存储表格中每一列的标题

        2.创建一个二维数组,存储表格中每一行的数据,其中二维数组内部的每个一维数组代表表格中的一行数据

        3.根据第一步和第二步创建的一维数组和二维数组,创建JTable对象

        4.把JTable添加到其他容器中显示

案例:

        使用JTable实现下图效果:

Java图形化界面编程超详细知识点(10)——Swing_表格_第1张图片

public class SimpleTable {

    JFrame jf = new JFrame("简单表格");

    //创建一维数组,存储标题
    Object[] titles = {"姓名","年龄","性别"};

    //创建二维数组,存储数据
    Object[][] data = {
            {"李清照",29,"女"},
            {"苏格拉底",56,"男"},
            {"李白",35,"男"},
            {"弄玉",18,"女"},
            {"虎头",2,"男"}

    };

    public void init(){
        //组装视图
        JTable jTable = new JTable(data,titles);

        jf.add(new JScrollPane(jTable));
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);
    }

    public static void main(String[] args) {
        new SimpleTable().init();
    }
}

7.2 TableModel

        与JList、JTree类似的是,JTable采用了TableModel来保存表格中的所有状态数据:与ListModel类似的是,TableModel也不强制保存该表格显示的数据。虽然在前面程序中看到的是直接利用一个二维数组来创建JTable对象,但也可以通过TableModel对象来创建表格。

自定义TableModel步骤:

1.自定义类,继承AbstractTableModel抽象类,重写下面方法:

int getColumnCount();返回表格列的数量

int getRowCount();返回表格行的数量

Object getValueAt(int rowIndex,int columnIndex);返回rowIndex行,column列的单元格的值

String getColumnName(int columnIndex);返回columnIndex列的列名称

boolean isCellEditable(int rowIndex,int columnIndex);设置rowIndex行,columnIndex列单元格是否可编辑

2.创建自定义类对象,根据该对象,创建JTable对象

案例:

Java图形化界面编程超详细知识点(10)——Swing_表格_第2张图片

代码演示:

public class TableModelTest {
    JFrame jf = new JFrame("TableModel演示");
    //创建一维数组,存储标题
    Object[] titles = {"姓名","年龄","性别"};

    //创建二维数组,存储数据
    Object[][] data = {
            {"李清照",29,"女"},
            {"苏格拉底",56,"男"},
            {"李白",35,"男"},
            {"弄玉",18,"女"},
            {"虎头",2,"男"}
    };
    private Vector titlesV = new Vector();//存储标题
    private Vector dataV = new Vector<>();//存储数据

    public void init(){
       //组装视图
        for (int i = 0; i < titles.length; i++) {
            titlesV.add(titles[i]);
        }

        for (int i = 0; i < data.length; i++) {
            Vector t = new Vector<>();
            for (int j = 0; j < data[i].length; j++) {
                t.add(data[i][j]);
            }
            dataV.add(t);
        }
        MyTableModel myTableModel = new MyTableModel();
        //JTable jTable = new JTable(dataV,titlesV);
        JTable jTable = new JTable(myTableModel);

        jf.add(new JScrollPane(jTable));

        JButton btn = new JButton("获取选中行数据");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedColumn = jTable.getSelectedColumn();
                int selectedRow = jTable.getSelectedRow();
                System.out.println("当前选中行的索引:"+selectedRow);
                System.out.println("当前选中列的索引:"+selectedColumn);

                Object value = myTableModel.getValueAt(selectedRow, selectedColumn);
                System.out.println("当前选中行第一个单元格的内容为:"+value);
            }
        });
        jf.add(btn, BorderLayout.SOUTH);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);
    }

    private class MyTableModel extends AbstractTableModel{

        @Override
        public int getRowCount() {
            return dataV.size();
        }

        @Override
        public int getColumnCount() {
            return titlesV.size();
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return dataV.get(rowIndex).get(columnIndex);
        }

        @Override
        public String getColumnName(int column) {
            return (String) titlesV.get(column);
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }
    }



    public static void main(String[] args) {
        new TableModelTest().init();
    }

}

        不仅用户可以扩展AbstractTableModel抽象类,Swing本身也为AbstractTableModel提供了一个DefaultTableModel实现类,程序可以通过使用DefaultTableModel实现类来创建JTable对象。通过DefaultTableModel对象创建JTable对象后,就可以调用它提供的方法来添加数据行、插入数据行、删除数据行和移动数据行。DefaultTableModel提供了如下几个方法来控制数据行操作:

addColumn(Object columnName);添加一列

addRow(Object[] rowData);添加一行

insertRow(int row,Object[] rowData);指定位置处插入一行

removeRow(int row);删除一行

moveRow(int start,int end,int to);移动指定范围内的数据行

案例:

 Java图形化界面编程超详细知识点(10)——Swing_表格_第3张图片

public class DefaultTableModelTest {
    JFrame jf = new JFrame("TableModel演示");
    //创建一维数组,存储标题
    Object[] titles = {"姓名","年龄","性别"};

    //创建二维数组,存储数据
    Object[][] data = {
            {"李清照",29,"女"},
            {"苏格拉底",56,"男"},
            {"李白",35,"男"},
            {"弄玉",18,"女"},
            {"虎头",2,"男"}

    };

    private Vector titlesV = new Vector();//存储标题
    private Vector dataV = new Vector<>();//存储数据



    public void init(){
       //组装视图
        for (int i = 0; i < titles.length; i++) {
            titlesV.add(titles[i]);
        }

        for (int i = 0; i < data.length; i++) {
            Vector t = new Vector<>();
            for (int j = 0; j < data[i].length; j++) {
                t.add(data[i][j]);
            }
            dataV.add(t);
        }


        //通过DefaultTableModel创建JTable
        DefaultTableModel model = new DefaultTableModel(dataV,titlesV);
        JTable jTable = new JTable(model);

        //创建按钮
        JButton addRow = new JButton("添加一行");
        JButton addColum = new JButton("添加一列");
        JButton deleteRow = new JButton("删除一行");

        addRow.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //需要给表格添加一行
                model.addRow(new Object[]{"胡歌",30,"男"});
            }
        });

        deleteRow.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedRow = jTable.getSelectedRow();
                model.removeRow(selectedRow);
            }
        });



        addColum.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                model.addColumn("职业");
            }
        });

        JPanel panel = new JPanel();
        panel.add(addRow);
        panel.add(addColum);
        panel.add(deleteRow);

        jf.add(panel, BorderLayout.SOUTH);

        jf.add(new JScrollPane(jTable));
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);
    }


    public static void main(String[] args) {
        new DefaultTableModelTest().init();
    }

}

你可能感兴趣的:(Java图形化设计,java)