2

一个快速的问题:

我正在尝试将一些信息从 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);
    }

}
4

1 回答 1

3

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

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

建议:

  • 将表格放入 JScrollPane
  • 放置 JScrollPane BorderLayout.CENTER - 你的 contentPane JPanel 可以很好地解决这个问题。
  • 给 JTable 一个像样的模型。甚至是最简单的 DefaultTableModel,它带有一个列标题字符串数组和一个 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);
    }
}
于 2018-12-03T03:01:28.777 回答