繁体   English   中英

JTable-将行添加到已排序的表中会导致NullPointerException

[英]JTable - Adding row to sorted table gives NullPointerException

我创建了一个JTable,并且在GUI中此JTable上方有8个不同的按钮。 根据您按的是哪个按钮,表中将填充不同的数据(总是相同的列),并且在此之前,它会删除所有旧数据(从之前按下的按钮中删除)

一切工作正常-直到我对一列进行排序。

我正在使用此代码为我的表设置一个排序器:

    TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model);
    table.setRowSorter(sorter);

这段代码可以计算/添加新行:

button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            model.setRowCount(0);

            new Thread(new Runnable(){
                public void run(){

                    // Here is a call to another class which is calculating 
                    // the values and adding the row, but basically it is just.. 
                    // adding a row , so i exchanged it with this:

                    model.addRow(Object[]);

                }
            }).start();
        }
    });

如我所说,该异常在我对列进行排序时出现,默认排序不会引发任何异常。

我已经阅读过有关EDT的信息,并且使用这种代码,我正在编辑EDT之外的表,并可能使用InvokeLater。 试图使用它,并阅读有关它的一些文档,但我无法使其正常工作。

从这里获取信息: 对JTable进行排序会导致NullPointerException

这对我来说是一个新领域,因此告诉我“仅添加xyz或执行xyz”将无济于事,因为我不知道我应该怎么做,这意味着如果有人可以给我提供示例,这将非常好甚至将其添加到我的代码中

这是我得到的异常(重复多次):

线程“ AWT-EventQueue-0”中的异常javax.swing.DefaultRowSorter.convertRowIndexToModel(未知源)处的javax.swing.JTable.convertRowIndexToModel(未知源)处的javax.swing.JTable.getValueAt(未知源)处的异常),位于javax.swing.plaf.basf.basic.BasicTableUI.paintCell(未知源),位于javax.swing.plaf.basf.basic.BasicTableUI.paintCells(未知源),位于javax.swing.plaf.basic.BasicTableUI.paintCell(未知源),位于javax.swing。 javax.swing.plaf.ComponentUI.update(未知源)的java.swing.JComponent.paintComponent(未知源)的javax.swing.JComponent.paint(未知源)的plaf.basic.BasicTableUI.paint(未知源) javax.swing.JComponent.paintChildren(未知源)处javax.swing.JComponent.paint(未知源)处javax.swing.JComponent.paintChildren(未知源)处javax.swing.JComponent.paintChildren(未知源)。 javax.swing.swing.JComponent.paintToOffscreen的swing.JComponent.paint(未知源)javax.swing.RepaintManager的swing.JComponent.paintToOffscreen(未知源) javax.swing.RepaintManager中的$ PaintManager.paintDoubleBuffered(未知源)javax.swing.RepaintManager.paint(未知源)在javax.swing.JComponent._paintImmediately(未知源)在javax.swing .JComponent.paintImmediately(未知源)在javax.swing.RepaintManager $ 4.run(未知源)在javax.swing.RepaintManager $ 4.run(java.security.AccessController.doPrivileged(本机方法)在java.security .ProtectionDomain $ 1.doIntersectionPrivilege(未知源)在javax.swing.RepaintManager.paintDirtyRegions(未知源)在javax.swing.RepaintManager.paintDirtyRegions(未知源)在javax.swing.RepaintManager.prePaintDirtyRegions(未知源)在javax.swing。 javax.swing中的RepaintManager.access $ 1300(未知源)java.awt.event.InvocationEvent.dispatch中的RepaintManager $ ProcessingRunnable.run(未知源)java中的java.awt.EventQueue.dispatchEventImpl(未知源) .awt.EventQueue.access $ 500( 来源java.awt.EventQueue $ 3.run的来源不明(来源不明)java.security.AccessController.doPrivileged(本机方法)的java.security.ProtectionDomain $ 1.doIntersectionPrivilege处的java.awt.EventQueue $ 3.run(来源不明) (未知源)在java.awt.EventQueue.dispatchEvent(未知源)在java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)在java.awt.EventDispatchThread.pumpEventsForFilter(未知源)在java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)(java.awt.EventDispatchThread.pumpEvents(未知源)java.awt.EventDispatchThread.pumpEvents(未知源)java.awt.EventDispatchThread.run(未知源)

model.addRow(Object[]); 看起来很可疑。 您正在添加没有数据的行。

另外,您确实应该在UI线程中执行此操作。 使用SwingUtilities.invokeLater

代替

new Thread(new Runnable(){
    public void run(){

SwingUtilities.invokeLater(new Runnable(){
    public void run(){

别这样

        new Thread(new Runnable(){
            public void run(){

                // Here is a call to another class which is calculating 
                // the values and adding the row, but basically it is just.. 
                // adding a row , so i exchanged it with this:

                model.addRow(Object[]);

            }
        }).start();

这是在事件调度线程的上下文之外修改UI的状态,这导致UI,模型和排序器之间的竞争状态。

Swing不是线程安全的,因此应该在EDT的上下文内对UI进行任何修改(或可能影响UI的任何修改)。

使用SwingUtilities.invokeLaterSwingWorker

有关更多详细信息,请参见Swing中的并发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM