[英]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.invokeLater
或SwingWorker
有关更多详细信息,请参见Swing中的并发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.