在上面的代码中,对表格单元格应用了不同的JFormattedTextField,问题是改变单元格中的值时,没有保存,请问如何解决这个问题?代码显示完整
public class KadrPress extends JFrame{
public KadrPress() throws HeadlessException {
super("Кадровая работа");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(lineMenu(),"North");
this.add(osnTabPane(),"Center");
this.setExtendedState(MAXIMIZED_BOTH);
this.setVisible(true);
}
//Создание меню
private JMenuBar lineMenu()
{
//Меню файл
JMenuBar lineMenu=new JMenuBar();
//Меню Файл
JMenu filemenu=new JMenu("Файл");
JMenuItem newFile=new JMenuItem("Создать");
JMenuItem openFile=new JMenuItem("Открыть");
JMenuItem saveFile=new JMenuItem("Сохранить");
filemenu.add(newFile);
filemenu.add(openFile);
filemenu.add(saveFile);
filemenu.addSeparator();
filemenu.add(new ExitAction());
lineMenu.add(filemenu);
return lineMenu;
}
//Создание основной панели с вкладками
private JTabbedPane osnTabPane()
{
JTabbedPane osnTabPane=new JTabbedPane();
osnTabPane.addTab("Общие сведения",osnovSvedeniyaJLabel());
osnTabPane.addTab("Лист 2",new JPanel());
return osnTabPane;
}
//Панель основные сведения
private JPanel osnovSvedeniyaJLabel()
{
JPanel osnovSvedeniyaJLabel=new JPanel();
osnovSvedeniyaJLabel.setLayout(new GridLayout(1,2));
osnovSvedeniyaJLabel.add(levayaJTable());
osnovSvedeniyaJLabel.add(new JLabel("2"));
return osnovSvedeniyaJLabel;
}
//Модель основной таблицы
private JTable levayaJTable ()
{
String[]dannie=new String[]{
"Фамилия","Имя","Отчество","Личный номер","Число, месяц, год рождения",
"Место рождения (согласно паспорта)","Серия и номер паспорта","Дата выдачи","Кем выдан",
"Код подразделения","Серия и номер удост. личности (Военного билета)","Дата выдачи(ВБ)",
"Кем выдано","ИНН"
};
JTable levayaJTable=new JTable(new OsnovTable(dannie));
levayaJTable.setRowHeight(20);
levayaJTable.setOpaque(false);
levayaJTable.getColumnModel().getColumn(1)
.setCellEditor(new MaskEditor(new JFormattedTextField()));
return levayaJTable;
}
//Модель основной таблицы
private class OsnovTable extends AbstractTableModel
{
String[]dannie;
HashMap<String,String>data=new HashMap<>();
public OsnovTable(String[]dannie) {
this.dannie=dannie;
}
@Override
public int getRowCount() {
return dannie.length;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex==0)return dannie[rowIndex];
if (columnIndex==1) return data.get(dannie[rowIndex]);
return null;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex==0)return false;
if (columnIndex==1)return true;
return false;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data.put(dannie[rowIndex], (String) aValue);
}
}
//Создание редактора таблицы
private class MaskEditor extends DefaultCellEditor
{
public MaskEditor(JTextField textField) {
super(textField);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JFormattedTextField result= (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
MaskFormatter dateMask;
try
{
if (table.getModel().getValueAt(row,0).equals("Число, месяц, год рождения")
||table.getModel().getValueAt(row,0).equals("Дата выдачи"))
{
dateMask=new MaskFormatter("##.##.####");
result=new JFormattedTextField(dateMask);
}
if (table.getModel().getValueAt(row,0).equals("Серия и номер паспорта"))
{
dateMask=new MaskFormatter("#### ######");
result=new JFormattedTextField(dateMask);
}
result.setBorder(new LineBorder(null,0));
return result;
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}
}
//Команда выхода из приложения
class ExitAction extends AbstractAction
{
public ExitAction() {
putValue(NAME,"Выход");
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new KadrPress();
}
});
}
}
使用新编辑器部分解决了问题。但是现在我无法通过从可编辑单元格中按回车键退出,但这个问题较少