Java Swing:用户输入更新JTable但表格不可见问题求助
JTable界面不显示问题解决
问题描述
我正在练习使用JTable,参考Oracle J7的JTable文档,想要实现获取用户输入并显示在JTable中的简单功能。当前代码运行后,控制台能打印输入的列表,但界面上看不到JTable,请问遗漏了什么?
原代码
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; public class tablePractice { JFrame frame=new JFrame("Table Test"); JPanel panel=new JPanel(new FlowLayout(FlowLayout.CENTER)); JLabel username=new JLabel("Username: "); JTextField nameField=new JTextField(10); JButton add=new JButton("Add"); JTable table=new JTable(); JScrollPane scrollPane=new JScrollPane(); DefaultTableModel model=new DefaultTableModel(); ArrayList<String> list=new ArrayList<String>(); public void setInterface() { frame.setSize(300,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(panel); panel.add(username); panel.add(nameField); add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getSource()==add) { list.add(nameField.getText()); model.addRow(list.toArray()); System.out.println(list); } } }); panel.add(add); table.setModel(model); table.add(scrollPane); panel.add(table); frame.setVisible(true); frame.setLocationRelativeTo(null); } public static void main(String[] args) { tablePractice run=new tablePractice(); run.setInterface(); } }
问题原因及修复方案
1. 未给DefaultTableModel设置列结构
JTable依赖TableModel的列定义来渲染表格,没有列的话表格无法显示。需要先给model添加列:
// 初始化model时添加列,比如添加一个"用户名"列 DefaultTableModel model=new DefaultTableModel(new String[]{"用户名"}, 0);
2. JScrollPane使用方式错误
你把scrollPane添加到了table中,正确的逻辑是把table放入scrollPane,再将scrollPane添加到面板。JTable必须放在JScrollPane里才能正常显示表头和滚动功能:
// 替换原有的table.add(scrollPane)和panel.add(table) scrollPane.setViewportView(table); panel.add(scrollPane);
3. 添加行的逻辑错误
每次点击按钮时,你把整个list转成数组添加为一行,这会导致每行都包含所有历史输入。正确做法是只添加当前输入的内容作为一行,并且不需要用ArrayList存储(直接操作model即可):
add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getSource()==add) { // 只添加当前输入的文本作为一行 model.addRow(new Object[]{nameField.getText()}); // 清空输入框,提升体验 nameField.setText(""); } } });
修复后的完整代码
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class tablePractice { JFrame frame=new JFrame("Table Test"); JPanel panel=new JPanel(new FlowLayout(FlowLayout.CENTER)); JLabel username=new JLabel("Username: "); JTextField nameField=new JTextField(10); JButton add=new JButton("Add"); JTable table=new JTable(); JScrollPane scrollPane=new JScrollPane(); // 初始化时设置列名 DefaultTableModel model=new DefaultTableModel(new String[]{"用户名"}, 0); public void setInterface() { frame.setSize(300,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(panel); panel.add(username); panel.add(nameField); add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getSource()==add) { // 添加当前输入为一行 model.addRow(new Object[]{nameField.getText()}); nameField.setText(""); } } }); panel.add(add); table.setModel(model); // 将table放入scrollPane scrollPane.setViewportView(table); // 添加scrollPane到面板 panel.add(scrollPane); frame.setVisible(true); frame.setLocationRelativeTo(null); } public static void main(String[] args) { tablePractice run=new tablePractice(); run.setInterface(); } }
内容的提问来源于stack exchange,提问作者Brainmated
相关产品推荐
相关产品推荐

