Заменить одну JTable другой (импорт) Java

Я пытаюсь заменить одну Jtable, уже определенную этим соответствующим вектором векторных данных, на другие с теми же характеристиками, которые хранятся в файле. Вот мой код:

   else if (e.getActionCommand().equals("import"))
        {
            JFileChooser file = new JFileChooser();
            int i = file.showOpenDialog(this);

            if(i == JFileChooser.APPROVE_OPTION)
            {
                File f = file.getSelectedFile();
                String filePath = f.getPath();

                try
                {
                    ObjectInputStream input = new ObjectInputStream(new FileInputStream(filePath));
                    Vector vectorData = (Vector)input.readObject();
                    data = new DefaultTableModel(vectorData, columNames);
                    table = new JTable(data);

                    labelStatus.setText("Archivo exitosamente importado.");

                } catch (FileNotFoundException e1)
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } 

Проблема здесь в том, что когда я делаю импорт и выбираю файл, который содержит данные Jtable, фактическую таблицу не изменяет импортируемая, как я могу сделать Switch?

Вот код, где Jtable добавляется в ContentPane(Jpanel):

 //data & columnNames are the data tha i used originally with the old Jtable
DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);

        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); //Sorter Descending or Ascending the  data.
        table.setRowSorter(sorter);

        JScrollPane scrollTable = new JScrollPane(table);
        scrollTable.setBounds(22, 78, 764, 177);
        scrollTable.setViewportView(table);

        contentPane.add(scrollTable);

Примечание: я использую одну Jtable, DefaaultTableModel, использую ее как глобальную переменную и ссылаюсь на метод Import, чтобы изменить odl на новый, но использую тот же.

Новое обновление, весь функциональный код:

public class Demo extends JFrame implements ActionListener
{

    private JPanel contentPane;
    DefaultTableModel data;
    JTable table;
    Vector<String> dataRow;
    Vector<String> columnNames;
    JScrollPane scrollTable;

public Demo() throws FileNotFoundException, IOException, ClassNotFoundException
    {
        columnNames = new Vector<>();
        columnNames.addElement("Name");
        columnNames.addElement("Cc");
        columnNames.addElement("Age");
        columnNames.addElement("Phone");
        columnNames.addElement("Date");
        columnNames.addElement("Amount");

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:/Users/Harry/Desktop/AA gym Database.txt"));
        Vector data = (Vector)in.readObject(); //Add try catch instead of THROWS DECLARATION.

                                                     //rowData
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);



        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); //Sorter Descending or Ascending the  data.
            table.setRowSorter(sorter);

            scrollTable = new JScrollPane(table);
            scrollTable.setBounds(22, 78, 764, 177);
            scrollTable.setViewportView(table);

            contentPane.add(scrollTable);

public void actionPerformed(ActionEvent e)
    {
        else if (e.getActionCommand().equals("import"))
        {
            JFileChooser file = new JFileChooser();
            int i = file.showOpenDialog(this);

            if(i == JFileChooser.APPROVE_OPTION)
            {
                File f = file.getSelectedFile();
                String filePath = f.getPath();

                try
                {

                    ObjectInputStream input = new ObjectInputStream(new FileInputStream(filePath));
                    Vector vectorData = (Vector)input.readObject();
                    data = new DefaultTableModel(vectorData, columnNames);
                    table.setModel(data);
}
}
}
}

1 ответ

Решение
data = new DefaultTableModel(vectorData, columNames);
table = new JTable(data);

Вы создаете новую TableModel и новый JTable.

Проблема в том, что вы никогда не добавляете новую таблицу в графический интерфейс. Вы не можете просто изменить ссылку на переменную table и ожидать, что таблица будет добавлена ​​в GUI.

Таким образом, решение состоит в том, чтобы НЕ создавать новый JTable. Вместо этого вы просто сбрасываете TableModel существующей JTable:

data = new DefaultTableModel(vectorData, columNames);
table.setModel( data );

По сути, вам не следует создавать новые компоненты Swing, когда вы хотите изменить данные. Просто поменяй модель.

Редактировать:

Проверьте Сохранение содержимого Interactive JTable в файл.txt, чтобы прочитать его при следующем запуске, чтобы найти решение, которое позволит вам сохранить / восстановить таблицу.

Другие вопросы по тегам