Java 将交互式JTable的内容保存到.txt文件,以便在下次运行时读取

Java 将交互式JTable的内容保存到.txt文件,以便在下次运行时读取,java,swing,jtable,save,load,Java,Swing,Jtable,Save,Load,嘿,伙计们,我正在编写一个程序,向用户显示一个JTable,这样他们就可以在表窗口中输入一些数据。问题是,我不知道如何保存任何数据,所以当应用程序再次运行时,数据可以重新打开。我希望在应用程序关闭时自动保存数据,但如果需要,我很乐意使用按钮 我不知道如何保存数据 从JTable API(以及所有Swing组件)中,您将看到: 警告:此类的序列化对象将与将来的Swing版本不兼容。。。。从1.4开始,支持所有JavaBean的长期存储™ 已添加到java.beans包中。请参阅XMLEncoder

嘿,伙计们,我正在编写一个程序,向用户显示一个JTable,这样他们就可以在表窗口中输入一些数据。问题是,我不知道如何保存任何数据,所以当应用程序再次运行时,数据可以重新打开。我希望在应用程序关闭时自动保存数据,但如果需要,我很乐意使用按钮

我不知道如何保存数据

从JTable API(以及所有Swing组件)中,您将看到:

警告:此类的序列化对象将与将来的Swing版本不兼容。。。。从1.4开始,支持所有JavaBean的长期存储™ 已添加到java.beans包中。请参阅XMLEncoder

以下是使用XMLEncoder的示例:

//  Following code is a more complete version of:
//  http://stackoverflow.com/q/26250939/131872

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;

public class DefaultTableModelPersistenceDelegateTest
{
    private File file = new File("TableModel.xml");
    private final JTextArea textArea = new JTextArea();

    private final String[] columnNames = {"Column1", "Column2"};

    private final Object[][] data =
    {
        {"aaa", new Integer(1)},
        {"bbb\u2600", new Integer(2)}
    };

    private DefaultTableModel model = new DefaultTableModel(data, columnNames);
    private final JTable table = new JTable(model);

    public JComponent makeUI()
    {
        model.setColumnCount(5);
        JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        sp.setResizeWeight(.3);
        sp.setTopComponent(new JScrollPane(table));
        sp.setBottomComponent(new JScrollPane(textArea));

        JPanel p = new JPanel();
        p.add(new JButton(new AbstractAction("XMLEncoder")
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
                    XMLEncoder xe = new XMLEncoder(os);
                    xe.setPersistenceDelegate(DefaultTableModel.class, new DefaultTableModelPersistenceDelegate());
                    xe.writeObject(model);
                    xe.close();

                    Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
                    textArea.read(r, null);
                }
                catch (IOException ex)
                {
                    ex.printStackTrace();
                }
            }
        }));

        p.add(new JButton(new AbstractAction("XMLDecoder")
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    InputStream is = new BufferedInputStream( new FileInputStream( file ));
                    XMLDecoder xd = new XMLDecoder(is);
                    model = (DefaultTableModel)xd.readObject();
                    table.setModel(model);
                }
                catch (IOException ex)
                {
                    ex.printStackTrace();
                }
            }
        }));

        p.add(new JButton(new AbstractAction("clear")
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                model = new DefaultTableModel();
                table.setModel(model);
            }
        }));

        JPanel pnl = new JPanel(new BorderLayout());
        pnl.add(sp);
        pnl.add(p, BorderLayout.SOUTH);
        return pnl;
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override public void run()
            {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new DefaultTableModelPersistenceDelegateTest().makeUI());
        f.setSize(420, 340);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

//  See following link for more information on Using XMLEncoder:
//  http://www.oracle.com/technetwork/java/persistence4-140124.html

class DefaultTableModelPersistenceDelegate extends DefaultPersistenceDelegate
{
    //  Initially creates an empty DefaultTableModel. The columns are created
    //  and finally each row of data is added to the model.

    @Override
    protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder)
    {
        DefaultTableModel model= (DefaultTableModel)oldInstance;

        //  Create XML to restore the column names

        Vector<String> columnNames = new Vector<String>(model.getColumnCount());

        for (int i = 0; i < model.getColumnCount(); i++)
        {
            columnNames.add( model.getColumnName(i) );
        }

        Object[] columnNamesData = new Object[] { columnNames };
        encoder.writeStatement(new Statement(oldInstance, "setColumnIdentifiers", columnNamesData));

        //  Create XML to restore row data

        Vector row = model.getDataVector();

        for (int i = 0; i < model.getRowCount(); i++)
        {
            Object[] rowData = new Object[] { row.get(i) };
            encoder.writeStatement(new Statement(oldInstance, "addRow", rowData));
        }
    }
}
//以下代码是的更完整版本:
//  http://stackoverflow.com/q/26250939/131872
导入java.awt.*;
导入java.awt.event.*;
导入java.beans。*;
导入java.io.*;
导入java.util.Vector;
导入javax.swing.*;
导入javax.swing.table.*;
公共类DefaultTableModelPersistenceDelegateTest
{
私有文件File=新文件(“TableModel.xml”);
私有最终JTextArea textArea=新JTextArea();
私有最终字符串[]columnNames={“Column1”,“Column2”};
私有最终对象[][]数据=
{
{“aaa”,新整数(1)},
{“bbb\u2600”,新整数(2)}
};
private DefaultTableModel=new DefaultTableModel(数据、列名);
专用最终JTable表=新JTable(模型);
公共JComponent makeUI()
{
model.setColumnCount(5);
JSplitPane sp=新JSplitPane(JSplitPane.垂直拆分);
sp.setResizeWeight(.3);
sp.setTopComponent(新JScrollPane(表));
sp.setBottomComponent(新JScrollPane(textArea));
JPanel p=新的JPanel();
p、 添加(新的JButton(新的AbstractAction(“XMLEncoder”)
{
@凌驾
已执行的公共无效操作(操作事件e)
{
尝试
{
OutputStream os=新的BufferedOutputStream(新文件OutputStream(文件));
XMLEncoder xe=新的XMLEncoder(os);
setPersistenceDelegate(DefaultTableModel.class,新的DefaultTableModelPersistenceDelegate());
xe.writeObject(模型);
xe.close();
Reader r=新的BufferedReader(新的InputStreamReader(新文件InputStream(文件),“UTF-8”);
textArea.read(r,null);
}
捕获(IOEX异常)
{
例如printStackTrace();
}
}
}));
p、 添加(新的JButton(新的AbstractAction(“XMLDecoder”)
{
@凌驾
已执行的公共无效操作(操作事件e)
{
尝试
{
InputStream is=new BufferedInputStream(new FileInputStream(file));
XMLDecoder xd=新的XMLDecoder(is);
model=(DefaultTableModel)xd.readObject();
表2.setModel(model);
}
捕获(IOEX异常)
{
例如printStackTrace();
}
}
}));
p、 添加(新JButton(新抽象操作(“清除”)
{
@凌驾
已执行的公共无效操作(操作事件e)
{
模型=新的DefaultTableModel();
表2.setModel(model);
}
}));
JPanel pnl=newjpanel(newborderlayout());
pnl.add(sp);
pnl.add(p,南部边界布局);
返回pnl;
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
@重写公共无效运行()
{
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI()
{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的DefaultTableModelPersistenceDelegateTest().makeUI());
f、 设置大小(420340);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
//有关使用XMLEncoder的更多信息,请参阅以下链接:
//  http://www.oracle.com/technetwork/java/persistence4-140124.html
类DefaultTableModelPersistenceDelegate扩展了DefaultPersistenceDelegate
{
//最初创建一个空的DefaultTableModel
//最后,将每行数据添加到模型中。
@凌驾
受保护的void初始化(类类型、对象oldInstance、对象newInstance、编码器)
{
DefaultTableModel=(DefaultTableModel)oldInstance;
//创建XML以还原列名
Vector columnNames=新向量(model.getColumnCount());
对于(int i=0;i
尝试序列化
表格模型
而不是组件。如果你在做这件事时遇到困难,准备一份你最好的尝试,并提出一个具体的问题。