如果我在ABOVE JTable中选择一行,那么对应于该数据的行将出现在JTable BELOW中。下面Jtable中的所有单元格都是可编辑的。我需要的是:
如果按下按钮,将保存Jtable BELOW中的更改。如果我不按下按钮,JTable单元将保持原来处于应用程序的原始状态。
PS:这是一个演示,真实案例包含更多参数,但目的是相同的。
package guarreo;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class demo extends JFrame {
private JPanel contentPane;
private JTable tablePATIENTS;
private JTable tableREPORTS;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
demo frame = new demo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public demo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 571, 336);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
tablePATIENTS = new JTable();
tablePATIENTS.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
if(tablePATIENTS.getSelectedRow()!=-1){//If there is a patient selected with a report, enable the save changes button
DefaultTableModel dtm2 = (DefaultTableModel) tableREPORTS.getModel();
dtm2.addRow(new Object[]{"200$", "Pills", "Headache"});
tableREPORTS.setModel(dtm2);
}
}
});
tablePATIENTS.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"Name", "Surrname", "Doctor"
}
));
DefaultTableModel dtm = (DefaultTableModel) tablePATIENTS.getModel();
dtm.addRow(new Object[]{"Jon", "Snow", "Jack"});
JButton btnSaveChanges = new JButton("Save changes tableREPORTS");
btnSaveChanges.setEnabled(false);
btnSaveChanges.setBounds(155, 260, 212, 23);
contentPane.add(btnSaveChanges);
tablePATIENTS.setModel(dtm);
tablePATIENTS.setBounds(20, 11, 486, 107);
contentPane.add(tablePATIENTS);
tableREPORTS = new JTable();
tableREPORTS.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
btnSaveChanges.setEnabled(true); //Enabled only if something selected in this table
}
});
tableREPORTS.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"Cost", "Treatment", "Disease"
}
));
tableREPORTS.setBounds(20, 144, 486, 105);
contentPane.add(tableREPORTS);
}
}
答案 0 :(得分:1)
一般解决方案是制作患者数据的深副本,并使用此数据副本创建辅助JTable数据。然后,用户可以对他们希望做的JTable数据进行任何更改,而不用担心副作用。按下按钮后,它的ActionListener会将JTable模型的数据转换回患者的数据,替换原始数据。所以关键是在按下按钮之前不要进行此替换。
如果Patient类包含信息类对象的ArrayList,并且此列表的getter应通过创建新的ArrayList进行深复制,并在for循环中填充深层副本在原始列表中保存的对象。
例如:
{{1}}