在另一个类中使用JTable

时间:2018-08-18 19:02:46

标签: java swing jtable

下面的代码从以“ |”分隔的文本文件中获取数据并将其显示在JTable中。当我在JFrame上运行它时,它确实起作用。但是,我无法弄清楚如何将其自身移至另一个类,并使之成为public void viewUser(){}之类的方法,然后单击按钮即可从框架中调用它。

public void viewUser(){
    File file = new File("user.dat");
    try {
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);

        DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
        Object[] lines = br.lines().toArray();

        for (Object line : lines) {
            String[] row = line.toString().split("\\|");
            model.addRow(row);
        }
    } catch (IOException ex) {
        Logger.getLogger(UserManagement.class.getName()).log(Level.SEVERE, null, ex);
    }

2 个答案:

答案 0 :(得分:0)

从概念上讲,您错了:模型本身是没有意义的。它需要连接到表上才能显示其内容。

您显示的代码正在创建并填充新的表格模型。然后,该模型和所有信息将被丢弃。当该对象不再可用于其他用途时,将数据读入对象是毫无意义的!

您可以简单地将返回类型从void更改为DefaultTableModel,最后返回模型对象。然后,您可以对任何JTable使用该预填充模型!

答案 1 :(得分:0)

运行此mcve,看看它是否模仿了您想做的事情:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TablePane extends JPanel {

    private final JTable table;

    public TablePane() {

        super(new GridLayout(1,0));
        String[] columnNames = {"Name", "Age" };

        Object[][] data = {
                {"Kathy", new Integer(35)},
                {"John", new Integer(63)},
                {"Sue", new Integer(28)},
                {"Joe", new Integer(70)}
        };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(300, 100));
        table.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    void refresh() {
        new Updater(table).getNewData();
    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TablePane tablePane = new TablePane();
        frame.add(tablePane);
        JButton button = new JButton("Change data");
        button.addActionListener(e -> tablePane.refresh());
        frame.add(button, BorderLayout.NORTH);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class Updater {

    private DefaultTableModel model;

    Object[][] testData = {
            {"Bon", new Integer(15)},
            {"Anna", new Integer(31)},
            {"Dan", new Integer(82)},
            {"Jane", new Integer(20)},
    };

    public Updater(JTable table) {
         model = (DefaultTableModel)table.getModel();
    }

    void getNewData(){
        //if you want to clear data : model.getDataVector().clear();
        for (Object[] row : testData) {
            model.addRow(row);
        }
    }
}

正如安德鲁·汤姆森(Andrew Thomson mcve)所说,硬编码数据至关重要。