zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java Swing JTable:表格

JAVA 表格 swing
2023-09-14 09:14:12 时间

表格是 Swing 新增加的组件,主要功能是把数据以二维表格的形式显示出来,并且允许用户对表格中的数据进行编辑。表格组件是最复杂的组件之一,它的表格模型功能非常强大、灵活而易于执行。由于篇幅有限,本节只介绍默认的表格模型。

 

Swing 使用 JTable 类实现表格,常用构造方法如下所示。

  • JTable():构造一个默认的 JTable,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。
  • JTable(int numRows,int numColumns):使用 DefaultTableModel 构造具有 numRows 行和 numColumns 列个空单元格的 JTable。
  • JTable(Object[][] rowData,Object[] columnNames):构造一个 JTable 来显示二 维数组 rowData 中的值,其列名称为 columnNames。

创建一个带有滚动条的 JTable 对象非常简单,如下所示。

  1. JTable table=new JTable(5,6);
  2. JScrollPane pane=new JScrollPane(table);

第一条语句创建了一个 JTable 对象。第二条语句创建了一个存放 JTable 对象的 JScrollPane 对象,该对象是一个视图对象。JScrollPane是一个垂直和水平滚动条,以及可设置行和列标题的容器。上面两行代码执行后的表格效果如图1 所示。


图1 表格

 

表格有很多的选项设置,因此 JTable 类常用方法也很多,这些常用方法如表 1 所示。

方法名称说明
getColumnCount()返回列模型中的列数
getColumnN ame(int column)返回出现在视图中 column 列位置处的列名称
getRowCount()返回 JTable 中可以显示的行数(给定无限空间)
getRowSorter()返回负责排序的对象
getSelectedColumn()返回第一个选定列的索引,如果没有选定的列, 则返回 -1
getSelectedRow()返回第一个选定行的索引,如果没有选定的行, 则返回 -1
getValueAt(int row,int column)返回 row 和 column 位置的单元格值
isEditing()如果正在编辑单元格,则返回 true
selectAll()选择表中的所有行、列和单元格
setColumnSelectionInterval(int index0,int index1)选择从 index0 到 index1之间(包含两端)的列
setRowSelectionInterval(int index0,int index1)选择从 index0 到 index1 之间(包含两端)的行
setTableHeader(JTableHeader tableHeader)将此 JTable 所使用的 tableHeader 设置为 newHeader
setUpdateSelectionOnSort(boolean update)指定排序后是否应该更新选择
setValueAt(Object a Value,int row,int column)设置表模型中 row 和 column 位置的单元格值

例 1

使用 JTable 类创建一个包含 8 列的学生成绩表,并向表格中填充几行数据,具体实现代码如下所示。

  1. package ch18;
  2. import java.awt.Container;
  3. import javax.swing.JFrame;
  4. import javax.swing.JScrollPane;
  5. import javax.swing.JTable;
  6. public class JTableDemo
  7. {
  8. public static void main(String[] agrs)
  9. {
  10. JFrame frame=new JFrame("学生成绩表");
  11. frame.setSize(500,200);
  12. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. Container contentPane=frame.getContentPane();
  14. Object[][] tableDate=new Object[5][8];
  15. for(int i=0;i<5;i++)
  16. {
  17. tableDate[i][0]="1000"+i;
  18. for(int j=1;j<8;j++)
  19. {
  20. tableDate[i][j]=0;
  21. }
  22. }
  23. String[] name={"学号","软件工程","Java","网络","数据结构","数据库","总成绩","平均成绩"};
  24. JTable table=new JTable(tableDate,name);
  25. contentPane.add(new JScrollPane(table));
  26. frame.setVisible(true);
  27. }
  28. }

如上述代码所示,表格组件和其他组件类似,可以方便地创建一个 JTable 对象。 如果 JTbale 对象直接添加到 JFrame 中,则表头显示不出来,需要把表格对象放入 JScrollPane 对象中,之后把 JScrollPane 对象添加到 JFrame 中。实例的运行效果如图 2 所示。


图2 学生成绩表运行效果

例 2

Swing 中表格的数据可以根据需求动态变化,比如对于表格中不需要的数据,可以将其删除。本实例将演示如何从表格中删除用户选择的行,实现过程如下。

(1) 创建一个继承自 JFrame 的 RowDeleteDemo 类。

  1. package ch18;
  2. import java.awt.BorderLayout;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.WindowAdapter;
  6. import java.awt.event.WindowEvent;
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JPanel;
  10. import javax.swing.JScrollPane;
  11. import javax.swing.JTable;
  12. import javax.swing.ListSelectionModel;
  13. import javax.swing.border.EmptyBorder;
  14. import javax.swing.table.DefaultTableModel;
  15. public class RowDeleteDemo extends JFrame
  16. {
  17. private JPanel contentPane;
  18. private JTable table;
  19. /**
  20. * Launch the application.
  21. */
  22. public static void main(String[] args)
  23. {
  24. RowDeleteDemo frame = new RowDeleteDemo();
  25. frame.setVisible(true);
  26. }
  27. /**
  28. * Create the frame.
  29. */
  30. }

(2) 在构造方法中增加表格,设置表格的数据模型,添加“删除”按钮并监听单击事件。实现代码如下:

  1. public RowDeleteDemo()
  2. {
  3. addWindowListener(new WindowAdapter()
  4. {
  5. @Override
  6. public void windowActivated(WindowEvent e)
  7. {
  8. do_this_windowActivated(e);
  9. }
  10. });
  11. setTitle("图书信息表");
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setBounds(100,100,450,200);
  14. contentPane=new JPanel();
  15. contentPane.setBorder(new EmptyBorder(5,5,5,5));
  16. contentPane.setLayout(new BorderLayout(0,0));
  17. setContentPane(contentPane);
  18. JPanel panel=new JPanel();
  19. contentPane.add(panel,BorderLayout.SOUTH);
  20. JButton button=new JButton("删除");
  21. button.addActionListener(new ActionListener()
  22. {
  23. public void actionPerformed(ActionEvent e)
  24. {
  25. do_button_actionPerformed(e);
  26. }
  27. });
  28. panel.add(button);
  29. JScrollPane scrollPane=new JScrollPane();
  30. contentPane.add(scrollPane,BorderLayout.CENTER);
  31. table=new JTable();
  32. table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
  33. scrollPane.setViewportView(table);
  34. }

(3) 监听窗体激活事件,完成向表中增加数据的功能。这里使用了表格模型对象,它可以方便地处理表格中的数据。实现代码如下:

  1. protected void do_this_windowActivated(WindowEvent e)
  2. {
  3. DefaultTableModel tableModel=(DefaultTableModel) table.getModel(); //获得表格模型
  4. tableModel.setRowCount(0); //清空表格中的数据
  5. tableModel.setColumnIdentifiers(new Object[]{"书名","出版社","出版时间","丛书类别","定价"}); //设置表头
  6. tableModel.addRow(new Object[]{"Java从入门到精通(第2版)","清华大学出版社","2010-07-01","软件工程师入门丛书","59.8元"}); //增加列
  7. tableModel.addRow(new Object[]{"PHP从入门到精通(第2版)","清华大学出版社","2010-07-01","软件工程师入门丛书","69.8元"});
  8. tableModel.addRow(new Object[]{"Visual Basic从入门到精通(第2版)","清华大学出版社","2010-07-01","软件工程师入门丛书","69.8元"});
  9. tableModel.addRow(new Object[]{"Visual C++从入门到精通(第2版)","清华大学出版社","2010-07-01","软件工程师入门丛书","69.8元" });
  10. table.setRowHeight(30);
  11. table.setModel(tableModel); //应用表格模型
  12. }

(4) 监听用户单击“删除”按钮事件,这里通过 do_button_actionPerformed() 方法完成。在该方法中,首先获取表格模型,然后获得用户选择的行,再执行删除数据操作。实现代码如下:

  1. protected void do_button_actionPerformed(ActionEvent e)
  2. {
  3. DefaultTableModel model=(DefaultTableModel) table.getModel(); //获得表格模型
  4. int[] selectedRows=table.getSelectedRows();
  5. for(int i=selectedRows[0];i<selectedRows.length;i++)
  6. {
  7. model.removeRow(selectedRows[0]);
  8. }
  9. table.setModel(model);
  10. }

(5) 运行程序,默认在表格中会显示所有数据,如图 3 所示。图 4 所示为删除两行后的表格效果。


图3 删除前表格数据


图4 删除后表格数据