有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在另一个类中使用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) 个答案

  1. # 1 楼答案

    运行此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)评论的那样,硬编码数据至关重要

  2. # 2 楼答案

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

    显示的代码是创建和填充一个新的表模型。然后那个模型和所有的信息都被扔掉了。当对象无法进一步使用时,将数据读入对象是毫无意义的

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