[英]Sorting JTable causes NullPointerException
我有一個JTable,當點擊相應的按鈕時,它開始填充在后台繼續的文件樹步行的結果。 這很好用。
然后我決定要對表進行排序。 經過一些閱讀后,我創建了一個TableRowSorter並設置表來使用它。 它似乎工作,但仔細檢查后,我注意到幾個文件結果不存在。 我禁用了分揀機並再次運行程序並且所有文件都存在,再次重新啟用分揀機時有些遺漏,但每次丟棄時似乎都是不同的文件。
為了檢驗這一點,我創建了一個自包含的代碼塊作為測試(見下文),它代表了JTable代碼(事實上,大塊直接從現有程序代碼中提取)。 文件樹遍歷由for循環表示。 再次,沒有分揀機它完美地工作。 但是,當我啟用分揀機時(通過取消注釋第29行)整個程序凍結,我被告知有一個NullPointerException。
我不知道造成這些問題的原因是什么,事實上它們甚至是相關的。 歡迎任何有關錯誤的想法。
import javax.swing.table.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Sort extends JFrame{
private JTable table;
private DefaultTableModel model;
private TableRowSorter<DefaultTableModel> sorter;
private JButton go;
public Sort(){
super("Sort");
// Create table and model
model = new DefaultTableModel(0, 4);
table = new JTable(model);
// Setup sorting
sorter = new TableRowSorter<DefaultTableModel>(model);
ArrayList<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(2, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(3, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
//table.setRowSorter(sorter);
// Create Scroll Pane
JScrollPane tableScroller = new JScrollPane(table);
table.setFillsViewportHeight(true);
tableScroller.setPreferredSize(new Dimension(500, 200));
// Setup button
go = new JButton("Go");
go.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){
public Void doInBackground(){
for(int i = 0; i < 200; i++){
model.addRow( new Object[] { (new Integer(i)), String.valueOf(i), String.valueOf(i%50), String.valueOf(i%10) } );
}
return null;
}
};
worker.execute();
}
});
// Assemble GUI
JPanel panel = new JPanel(new BorderLayout());
panel.add(tableScroller, BorderLayout.CENTER);
panel.add(go, BorderLayout.SOUTH);
setContentPane(panel);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Sort();
}
});
}
}
這是堆棧跟蹤的一部分,它重復..
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:518) at javax.swing.JTable.convertRowIndexToModel(JTable.java:2645) at javax.swing.JTable.getValueAt(JTable.java:2720) at javax.swing.JTable.prepareRenderer(JTable.java:5718) at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114) at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016) at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812) at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) at javax.swing.RepaintManager.paint(RepaintManager.java:1206) at javax.swing.JComponent._paintImmediately(JComponent.java:5169) at javax.swing.JComponent.paintImmediately(JComponent.java:4980) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) at javax.swing.RepaintManager.access$700(RepaintManager.java:59) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException ...
你的代碼有一個很大的問題, 可以解釋你所觀察到的:你正在EDT 之外修改你的表模型,這是邪惡的。
由於您使用的是SwingWorker
,因此應該嘗試完全正確使用它,例如使用其publish
API來調用model.addRow()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.