【问题标题】:How to load data into Jtable如何将数据加载到 Jtable 中
【发布时间】:2015-09-10 09:38:50
【问题描述】:

我一直在做一个小程序来测试java中jtable的保存和加载数据。 保存没有问题但无法加载数据。当我加载数据表时显示为空,那里什么都没有。请问我有什么建议吗! 这是代码:

       public class NewOne extends JFrame {

       public static void main(String[] args) {
       EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                NewOne frame = new NewOne();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

            public NewOne() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton Button = new JButton("save");
    Button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
             saveTable();
        }
    });
    Button.setBounds(10, 11, 89, 23);
    contentPane.add(Button);

    JButton Button1 = new JButton("load");
    Button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            loadTable();
        }
    });
    Button1.setBounds(150, 11, 89, 23);
    contentPane.add(Button1);

    table = new JTable();
    table.setModel(new DefaultTableModel(
        new Object[][] {
            {null, null, null, null, null},
            {null, null, null, null, null},
            {null, null, null, null, null},
            {null, null, null, null, null},
            {null, null, null, null, null},
        },
        new String[] {
            "New column", "New column", "New column", "New column", "New column"
        }
    ));
    table.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
    table.setBounds(20, 45, 372, 80);
    contentPane.add(table);
}

private JFileChooser myJFileChooser = new JFileChooser(new File("."));

private DefaultTableModel tableModel = new DefaultTableModel();
      private JTable myJTable = new JTable(tableModel);
      private JTable table;

private void saveTable() {
    if (myJFileChooser.showSaveDialog(this) ==
            JFileChooser.APPROVE_OPTION ) {
        saveTable(myJFileChooser.getSelectedFile());
    }
}

private void saveTable(File file) {
    try {
        ObjectOutputStream out = new ObjectOutputStream(
                new FileOutputStream(file));
            out.writeObject(tableModel.getDataVector());
            out.writeObject(getColumnNames());
            out.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
}

private Vector<String> getColumnNames() {
    Vector<String> columnNames = new Vector<String>();
    for (int i = 0; i < myJTable.getColumnCount(); i++)
        columnNames.add(myJTable.getColumnName(i) );
        return columnNames;
}

private void loadTable() {
    if (myJFileChooser.showOpenDialog(this) ==
            JFileChooser.APPROVE_OPTION )
        loadTable(myJFileChooser.getSelectedFile());
}

private void loadTable(File file) {
    try {
        ObjectInputStream in = new ObjectInputStream(
        new FileInputStream(file));
        Vector rowData = (Vector)in.readObject();
        Vector columnNames = (Vector)in.readObject();
        tableModel.setDataVector(rowData, columnNames);
        in.close();
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
}
 }

【问题讨论】:

  • 1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。

标签: java swing jtable save load


【解决方案1】:

我猜你的问题出在这里:

 private void saveTable(File file) {
        try {
            ObjectOutputStream out = new ObjectOutputStream(
                    new FileOutputStream(file));
                out.writeObject(tableModel.getDataVector());
                out.writeObject(getColumnNames());
                out.close();
            }

如果我没有错过您的代码,您的 tableModelnew DefaultTableModel();。每个文档:“DefaultTableModel() 构造一个默认的 DefaultTableModel,它是一个零列零行的表。" 因此,您将一个空文件放入了 OutputSream。

也许你只是用错了表毕竟你想得到你的myJTable的内容吗?如果这是真的,解决方案应该如下所示:

private void saveTable(File file) {
            try {
                ObjectOutputStream out = new ObjectOutputStream(
                        new FileOutputStream(file));
                    out.writeObject(myJTable.getDataVector());
                    out.writeObject(getColumnNames());
                    out.close();
                }

如果我错了,请纠正我。国外代码很难看:P

【讨论】:

  • 谢谢,我已经改了 out.writeObject(tableModel.getDataVector());到 out.writeObject(myJTable.getDataVector());但它给了我错误 The method getDataVector() is undefined for the type JTable
  • 获取索引处的值 try:int selectedRowIndex = myJTable.getSelectedRow(); int selectedColumnIndex = myJTable.getSelectedColumn(); Object selectedObject = (Object) myJTable.getModel().getValueAt(selectedRowIndex, selectedColumnIndex);
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多