我有一个简单的Java GUI,它显示JTable
和几个按钮。我想在其中一个按钮上添加ActionListener
,这样每次点击它时,它都会向表中添加一个新的空的可编辑行。我已尝试按照How to add row in JTable?
我目前有一个方法是在我的GUI中添加一些其他元素的监听器,所以我尝试编辑该方法以包含该问题的答案所建议的内容。完成后,我的addListeners()
方法现在看起来像这样:
public void addListeners()
// Code to add existing listeners
/*Add listeners to the buttons */
addBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("'Add' button pressed. ");
DefaultTableModel model = (DefaultTableModel)jEntityFilterTable.getModel();
model.addRow(new Object[]{"Site", "Application", "Entity"});
}
});
}
但是,当我运行我的代码并单击调用此方法的按钮时,我在控制台中收到错误消息:
线程中的异常" AWT-EventQueue-0"显示java.lang.NullPointerException"
它抱怨的是:
addBtn.addActionListener(new ActionListener(){
但我无法理解为什么我在NullPointerException
... addBtn
和jEntityFilterTable
已被声明为类中的全局变量:<\ n / p>
private JButton addBtn;
private JTabel jEntityFilterTable = new JTable(new DefaultTableModel());
有人有任何建议吗?
答案 0 :(得分:3)
看起来您的按钮未实例化:
private JButton addBtn = new JButton("Add empty row");
根据您使用的IDE,您可以启用可以检测此类问题的警告。
编辑:
model.addRow(new Object[]{"Site", "Application", "Entity"});
应该包含值,或者不包含任何内容,而不是标题。
我尽可能使用您提供的语法快速运行示例,如果您有任何理解,请随时提出。
public static void main(String[] args)
{
JFrame jFrame = new JFrame("Add row");
jFrame.setSize(new Dimension(1280,720));
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final String[] columns = new String[]{"C1","C2"};
String[][] data = new String[][]{new String[]{"A1","A2"},new String[]{"B1","B2"}};
final JTable jTable = new JTable();
jTable.setModel(new DefaultTableModel(data,columns));
jFrame.add(new JScrollPane(jTable),BorderLayout.CENTER);
JPanel jPanel = new JPanel();
JButton jButton = new JButton("Add empty row");
jButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("'Add' button pressed.");
DefaultTableModel model = (DefaultTableModel)jTable.getModel();
model.addRow(new String[columns.length]);
}
});
jPanel.add(jButton);
jFrame.add(jPanel,BorderLayout.SOUTH);
jFrame.setVisible(true);
}