当前位置:   article > 正文

Java Swing组件:表格_java swing 表格

java swing 表格

       表格(JTable)是将数据以二维的形式展示给用户,它包括行和列,每一行表示一个对象,例如一个学生,每一列表示对象的一种属性,例如学生的学号、姓名等。表格组件是采用MVC(Model View Controller)模式进行设计,按照MVC的设计理念,JTable类属于视图,对应的数据模型是TableModel接口的实现类,用户可以根据自己的业务逻辑和数据结构来实现TableModel接口。在Swing中,抽象类AbstractTableModel是TableModel接口的一个实现类,它提供了TableModel接口的默认实现。在实际应用中,一般使用默认的数据模型DefaultTableModel来存储和管理表格的数据,该类是AbstractTableModel类的子类,它提供了常见的表格操作,例如,添加、修改、删除表格的数据等。由于表格的结构和功能比较复杂,因此,Swing中使用TableColumnModel接口的实现类来管理表格的列模型,使用ListSelectionModel接口的实现类来管理表格的选择模型。用户可以根据自己的需求来实现TableColumnModel和ListSelectionModel接口,也可以使用默认的列模型DefaultTableColumnModel(该类是TableColumnModel接口的实现类)和默认的选择模型DefaultListSelectionModel(该类是ListSelectionModel接口的实现类)来管理表格中列以及行和列的选择。

       JTable类的常用构造方法如下:

  • JTable():使用默认的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(int numRows, int numColumns):使用DefaultTableModel创建具有指定行数和列数的表格。
  • JTable(Object[][] numRows, int numColumns):通过指定的二维组数和列名创建表格。
  • JTable(TableModel dm):通过指定的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm):通过指定的数据模型、指定的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm):通过指定的数据模型、指定的列模型和指定的选择模型来创建表格。

       JTable类提供的方法非常多,限于篇幅,在这里只介绍几个常用的方法:

  • int getSelectedRow():返回第一个被选定行的索引,如果未选择任何行,则返回-1。
  • int[] getSelectedRows():返回所有选定行的索引。
  • int getSelectedRowCount():返回所选定行的数量。
  • Object getValueAt(int row,int column):返回指定单元格的值。

       创建表格一般先使用DefaultTableModel类的构造方法创建表格的数据模型,然后使用JTable类的构造方法创建表格并与数据模型进行关联。DefaultTableModel类的主要构造方法如下:

  • DefaultTableModel(Object[][] data, Object[] columnNames):通过指定二维组数和列名创建表格的数据模型。
  • void addRow(Object[] rowData):在数据模型的末尾添加一行。
  • void insertRow(int row, Object[] rowData):在数据模型中插入一行。
  • void setValueAt(Object aValue, int row, int column):设置单元格的对象值。
  • void removeRow(int row):从数据模型中删除一行。

       为了使表格能够对数据进行排序,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的数据映射成可排序的数据。在实际应用中,一般使用RowSorter的子类TableRowSorter与JTable进行关联。

【例1】下面程序使用指定的数据模型创建一个具有排序功能的表格,并对表格中的数据进行增加、修改和删除操作,其中,增加和修改功能是通过一个对话框来完成的。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import javax.swing.table.*;
  5. public class JTableDemo extends JFrame{
  6. Object[][] data= {};//表格的数据
  7. String columnNames[]= {"课程代码","课程名称","学分","学时"};//表格的列
  8. DefaultTableModel tableModel;//表格的数据模型
  9. JTable table; //表格
  10. JButton addButton=new JButton("增加");
  11. JButton editButton=new JButton("修改");
  12. JButton deleteButton=new JButton("删除");
  13. public JTableDemo() {
  14. JFrame frame=this;
  15. setTitle("表格示例");
  16. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  17. setLocationRelativeTo(null);
  18. setSize(400,300);
  19. Container contentPane=this.getContentPane();
  20. tableModel=new DefaultTableModel(data,columnNames);//创建数据模型
  21. table=new JTable(tableModel);//创建表格,关联数据模型
  22. RowSorter sorter=new TableRowSorter(tableModel);//创建表格行排序
  23. table.setRowSorter(sorter);//设置表格行排序
  24. JPanel panel=new JPanel();
  25. panel.add(addButton);
  26. panel.add(editButton);
  27. panel.add(deleteButton);
  28. contentPane.add(new JLabel("课程信息"),BorderLayout.NORTH);
  29. contentPane.add(new JScrollPane(table),BorderLayout.CENTER);
  30. contentPane.add(panel,BorderLayout.SOUTH);
  31. //增加按钮注册事件监听器
  32. addButton.addActionListener(new ActionListener() {
  33. public void actionPerformed(ActionEvent e) {
  34. new AddDialog(frame,tableModel,-1);
  35. }
  36. });
  37. //修改按钮注册事件监听器
  38. editButton.addActionListener(new ActionListener() {
  39. public void actionPerformed(ActionEvent e) {
  40. int row=table.getSelectedRow();//获取被选中的行号
  41. if(row!=-1) {
  42. new AddDialog(frame,tableModel,row);
  43. }
  44. }
  45. });
  46. //删除按钮注册事件监听器
  47. deleteButton.addActionListener(new ActionListener() {
  48. public void actionPerformed(ActionEvent e) {
  49. int[] rows=table.getSelectedRows();//获取所有被选中的行号
  50. if(rows.length>0) {
  51. for(int i=0;i<rows.length;i++) {
  52. tableModel.removeRow(rows[i]);//删除选中的行
  53. }
  54. }
  55. }
  56. });
  57. setVisible(true);
  58. }
  59. public static void main(String[] args) {
  60. JTableDemo frame=new JTableDemo();
  61. }
  62. }
  63. //对话框
  64. class AddDialog extends JDialog{
  65. JTextField codeField=new JTextField(10);
  66. JTextField nameField=new JTextField(10);
  67. JTextField scoreField=new JTextField(10);
  68. JTextField hoursField=new JTextField(10);
  69. JButton clearButton=new JButton("清空");
  70. JButton saveButton=new JButton("保存");
  71. public AddDialog(JFrame owner,DefaultTableModel model,int row) {
  72. super(owner,true);
  73. if(row==-1) {
  74. setTitle("增加课程");
  75. }else {
  76. setTitle("修改课程");
  77. codeField.setText((String)model.getValueAt(row,0));
  78. nameField.setText((String)model.getValueAt(row,1));
  79. scoreField.setText((String)model.getValueAt(row,2));
  80. hoursField.setText((String)model.getValueAt(row,3));
  81. }
  82. setSize(400,150);
  83. setLocationRelativeTo(null);//居中显示
  84. setResizable(false);//禁用最大化
  85. JPanel panel1=new JPanel();
  86. panel1.setLayout(new GridLayout(2,2));
  87. JPanel panel11=new JPanel();
  88. JPanel panel12=new JPanel();
  89. JPanel panel13=new JPanel();
  90. JPanel panel14=new JPanel();
  91. panel11.add(new JLabel("课程代码:"));
  92. panel11.add(codeField);
  93. panel12.add(new JLabel("课程名称:"));
  94. panel12.add(nameField);
  95. panel13.add(new JLabel("课程学分:"));
  96. panel13.add(scoreField);
  97. panel14.add(new JLabel("课程学时:"));
  98. panel14.add(hoursField);
  99. panel1.add(panel11);panel1.add(panel12);
  100. panel1.add(panel13);panel1.add(panel14);
  101. JPanel panel2=new JPanel();
  102. panel2.add(clearButton);
  103. panel2.add(saveButton);
  104. this.add(panel1,BorderLayout.CENTER);
  105. this.add(panel2,BorderLayout.SOUTH);
  106. //保存按钮注册事件监听器
  107. saveButton.addActionListener(new ActionListener() {
  108. public void actionPerformed(ActionEvent e) {
  109. if(!codeField.getText().equals("")&&
  110. !nameField.getText().equals("")&&
  111. !scoreField.getText().equals("")&&
  112. !hoursField.getText().equals("")) {
  113. Object rowData[]= {codeField.getText(),
  114. nameField.getText(),
  115. scoreField.getText(),
  116. hoursField.getText()};
  117. if(row==-1) {//增加课程
  118. model.addRow(rowData);
  119. }else {//修改课程信息
  120. model.setValueAt(codeField.getText(), row, 0);
  121. model.setValueAt(nameField.getText(), row, 1);
  122. model.setValueAt(scoreField.getText(), row, 2);
  123. model.setValueAt(hoursField.getText(), row, 3);
  124. }
  125. }
  126. }
  127. });
  128. //清空按钮注册事件监听器
  129. clearButton.addActionListener(new ActionListener() {
  130. public void actionPerformed(ActionEvent e) {
  131. codeField.setText("");
  132. nameField.setText("");
  133. scoreField.setText("");
  134. hoursField.setText("");
  135. }
  136. });
  137. this.setVisible(true);
  138. }
  139. }

       运行上述程序,显示结果如图1(a)所示,点击增加按钮弹出如图1(b)所示的对话框,录入课程信息后点击保存按钮,则该课程信息保存到表格中,可以在该对话框中录入多门课程,如图1(c)所示。选择表格中的某一行点击修改按钮后,弹出如图1(d)所示的对话框,在该对话框中可以修改课程信息,点击保存按钮按钮后,会更新表格中该课程的信息。选择表格中的一行或多行课程,点击删除按钮后会从表格中删除这些课程。

(a)

(c)

(b)

(d)

图1. 表格使用示例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/833440
推荐阅读
相关标签
  

闽ICP备14008679号