如果按下按钮,则仅在JTable中保存单元格更改,如果不按原样保留

时间:2017-01-08 14:45:54

标签: java swing jtable

如果我在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);
    }
}

1 个答案:

答案 0 :(得分:1)

一般解决方案是制作患者数据的副本,并使用此数据副本创建辅助JTable数据。然后,用户可以对他们希望做的JTable数据进行任何更改,而不用担心副作用。按下按钮后,它的ActionListener会将JTable模型的数据转换回患者的数据,替换原始数据。所以关键是在按下按钮之前不要进行此替换。

如果Patient类包含信息类对象的ArrayList,并且此列表的getter应通过创建新的ArrayList进行复制,并在for循环中填充深层副本在原始列表中保存的对象。

例如:

{{1}}