将CSV导入Jpanel上的JTable(无CSVReader)



一个快速问题:

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

发布的代码有几个问题:

  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);
}
}

最新更新