【问题标题】:Importing CSV into JTable on Jpanel (no CSVReader)将 CSV 导入 Jpanel 上的 JTable(无 CSVReader)
【发布时间】:2018-12-03 01:21:48
【问题描述】:

一个简单的问题:

我正在尝试将一些信息从 CSV 导入到位于我的程序的摆动面板上的 jtable 中。

我已使用 inputstream 将信息导入 actionListener 并使用 bufferedreader 对其进行解析。之后我只是使用了一个简单的 while 循环来添加到 Jtable 中。但是,当我运行该应用程序时,我的 jtable 中没有显示任何信息。

当我尝试调试程序时,在两个 jpanel(以及它们上的其他信息)之间切换没有问题,它只是我的 jtable 显示为空。

这是我的代码:

public class wert extends JFrame {

    private JPanel contentPane;
    private JPanel panel;
    private JTable table;

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

    /**
     * Create the frame.
     */
    public wert() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 925, 486);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Path filePath = Paths.get("\\test folder\\newNeetest.csv\\");
                    InputStream input = null;

                    input = Files.newInputStream(filePath);
                     BufferedReader reader = new BufferedReader (new InputStreamReader(input));

                     DefaultTableModel model = (DefaultTableModel)table.getModel();

                    Object [] lines = reader.lines().toArray();

                    for (int q =0; q > lines.length; q++) {
                        String dsa = lines[q].toString();
                        String [] dataRow = dsa.split(",");
                        model.addRow(dataRow);
                    }
                    } 


                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }



            }
        );
        contentPane.add(btnNewButton, BorderLayout.NORTH);

        panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);

        table = new JTable();
        GroupLayout gl_panel = new GroupLayout(panel);
        gl_panel.setHorizontalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel.createSequentialGroup()
                    .addGap(475)
                    .addComponent(table, GroupLayout.PREFERRED_SIZE, 230, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(188, Short.MAX_VALUE))
        );
        gl_panel.setVerticalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(table, GroupLayout.DEFAULT_SIZE, 0, Short.MAX_VALUE)
                    .addGap(375))
        );
        panel.setLayout(gl_panel);
    }

}

【问题讨论】:

  • 您如何知道数据已添加到 TableModel 中?您如何知道您的方法正在引用 GUI 上可见的表。也许您创建了 JTable 的两个实例。
  • 这不是一个简单的问题,因为您要帮助调试我们无法编译、运行或测试的代码。如果您没有很快得到解决方案,请考虑将有效的minimal reproducible example 程序作为代码格式的文本(正如您在此处使用代码 sn-p 所做的那样)与您的问题一起发布。这为我们提供了帮助找出问题及其解决方案的最佳机会。
  • @camickr 虽然我的应用程序中有多个表,但默认表模型是引用表 3,这是我正在处理的面板中唯一的表......除非我错过了什么?
  • @Leemim,1) 我问了你两个问题。 2)您更新的代码仍然没有告诉我们任何信息。 a) 我们不知道您在哪里创建表格。 b) 它不是“MCVE”。我们无法编译/测试代码,也无权访问您的文件。因此,在“MCVE”中,您应该将硬编码数据添加到模型中。一旦你证明它有效,你就可以从文件中获取数据。在您的“MCVE”中,我们不关心您的其他表,只关心导致问题的表。
  • 除了@HovercraftFullOfEels 关于创建 MCVE 的建议之外,删除外部数据文件并用硬编码的String 替换它,而不是只包含两行数据。顺便说一句“将 CSV 导入 Jpanel 上的 JTable(无 CSVReader)” 到您实现这一点时,您将至少拥有一个简单的 CSV 阅读器。

标签: java arrays swing events windowsbuilder


【解决方案1】:

您发布的代码存在一些问题:

  1. 首先,它需要一个我们不知道的外部文件。幸运的是,这是可以克服的
  2. 不要将 JTable 放入 JScrollPane。滚动窗格非常适合显示完整的 JTable,包括其列标题。
  3. 您使用 GroupLayout,这不是必需的,更重要的是可能会为您搞砸,因为它限制了表格的可视化
  4. 你没有给你的 JTable 一个像样的表模型,一个带有列标题的模型,所以当你向它添加新数据时,模型会混淆并且可能不知道要显示多少列

建议:

  • 将表格放入 JScrollPane 中
  • 放置 JScrollPane BorderLayout.CENTER -- 您的 contentPane JPanel 可以很好地解决这个问题。
  • 给 JTable 一个像样的模型。甚至是最简单的 DefaultTableModel,它带有一个列标题 String 数组和一个 int,0,用于初始行数。
  • 确保列标题字符串数组的长度是实际需要的列数

例如,您的代码更改为有效的 MCVE:

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class Wert2 extends JFrame {

    private JPanel contentPane;
    private JTable table;

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

    public Wert2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // file I/O code removed for sake of MCVE
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                for (int i = 0; i < 10; i++) {
                    Vector<String> rowData = new Vector<>();
                    for (int j = 0; j < 3; j++) {
                        rowData.add(String.format("[%d, %d]", i, j));
                    }
                    model.addRow(rowData);
                }
            }

        });
        contentPane.add(btnNewButton, BorderLayout.NORTH);

        // contentPane.add(panel, BorderLayout.CENTER);
        String[] colNames = {"A", "B", "C"};
        table = new JTable(new DefaultTableModel(colNames, 0));
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        contentPane.add(scrollPane);
    }
}

【讨论】:

  • 感谢您的无限耐心。我将在我的应用程序上完成这个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2015-01-20
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多