在GUI中向表中添加行

时间:2014-06-26 09:54:42

标签: java swing nullpointerexception jtable defaulttablemodel

我有一个简单的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 ... addBtnjEntityFilterTable已被声明为类中的全局变量:<\ n / p>

private JButton addBtn;
private JTabel jEntityFilterTable = new JTable(new DefaultTableModel());

有人有任何建议吗?

1 个答案:

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