学生信息面板主要由JTable实现,要能实现按照行排序功能,可以在表格中直接更改学号值,当学号值不正确(要求字字符且是8位长度,前4位表示年份,后四位表示学生编号。比如20220022,表示2022年入学,学生编号为22)。
时间: 2024-02-22 17:56:20 浏览: 64
好的,您的问题是关于学生信息面板的实现。我可以回答您的问题。
学生信息面板可以使用JTable实现,并且可以实现按照行排序功能。要直接在表格中更改学号值,您可以使用TableCellEditor接口来编辑单元格。为了确保学号值正确,您需要添加一个CellEditorListener来验证学号值。如果学号值不正确,则可以通过抛出一个异常来阻止更改。
以下是一个简单的示例代码,可以实现您所需的功能:
```
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class StudentInfoPanel extends JPanel {
private JTable table;
private DefaultTableModel model;
public StudentInfoPanel() {
String[] columnNames = {"姓名", "学号", "性别", "年龄"};
Object[][] data = {
{"张三", "20220001", "男", 20},
{"李四", "20220002", "女", 19},
{"王五", "20220003", "男", 21},
{"赵六", "20220004", "女", 18},
{"孙七", "20220005", "男", 22}
};
model = new DefaultTableModel(data, columnNames) {
@Override
public boolean isCellEditable(int row, int column) {
return column != 1; // 学号列不可编辑
}
};
table = new JTable(model);
table.getColumnModel().getColumn(1).setCellEditor(new StudentIdCellEditor());
table.setAutoCreateRowSorter(true); // 启用行排序
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}
private class StudentIdCellEditor extends AbstractCellEditor implements TableCellEditor, CellEditorListener {
private JTextField textField;
public StudentIdCellEditor() {
textField = new JTextField();
textField.setBorder(BorderFactory.createEmptyBorder());
textField.setHorizontalAlignment(JTextField.CENTER);
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (!Character.isDigit(c) || textField.getText().length() >= 8) {
e.consume();
}
}
});
}
@Override
public Object getCellEditorValue() {
return textField.getText();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
textField.setText(value.toString());
return textField;
}
@Override
public void editingStopped(ChangeEvent e) {
String text = textField.getText();
if (!isValidStudentId(text)) {
textField.setBorder(BorderFactory.createLineBorder(Color.RED));
throw new RuntimeException("学号格式不正确");
} else {
textField.setBorder(BorderFactory.createEmptyBorder());
}
fireEditingStopped();
}
@Override
public void editingCanceled(ChangeEvent e) {
fireEditingCanceled();
}
private boolean isValidStudentId(String id) {
if (id.length() != 8) {
return false;
}
try {
int year = Integer.parseInt(id.substring(0, 4));
int num = Integer.parseInt(id.substring(4, 8));
if (year < 2022 || year > 2099 || num < 1 || num > 9999) {
return false;
}
} catch (NumberFormatException e) {
return false;
}
return true;
}
}
}
```
在这个示例中,我们使用了DefaultTableModel来存储学生信息,并将其传递给JTable。我们禁用了学号列的编辑功能,并使用StudentIdCellEditor来编辑学号单元格。当学号值发生更改时,我们使用CellEditorListener来验证学号值,如果不正确,则抛出一个异常来阻止更改。
希望这个示例代码能够解决您的问题。如果您还有其他问题,请随时问我。
阅读全文