lassificar JTable causa NullPointerException
Tenho uma JTable que, quando o botão apropriado é clicado, começa a ser preenchida com os resultados de uma caminhada na árvore de arquivos que ocorre em segundo plano. Isso funciona bem.
Decidi, então, que eu quero que a tabela seja classificada. Após algumas leituras, criei um TableRowSorter e configurei a tabela para usá-lo. Pareceu funcionar, mas após uma inspeção mais detalhada, notei que vários resultados do arquivo estavam ausentes. Desativei o classificador e executei o programa novamente e todos os arquivos estavam presentes. Ao reativar o classificador novamente, alguns foram perdidos, mas parecia haver arquivos diferentes cada vez que estavam sendo descartado
Para examinar isso, criei um bloco de código independente como teste (veja abaixo), que deveria ser representativo do código da JTable (na verdade, grandes blocos foram retirados diretamente do código de programa existente). A caminhada na árvore de arquivos é representada por um loop for. Mais uma vez, funcionou perfeitamente sem o classificador. Quando ativei o classificador, no entanto (descomentando a linha 29), todo o programa foi liberado e me disseram que havia uma NullPointerExceptio
Não tenho idéia do que está causando esses problemas, nem se eles são, de fato, relacionados. Qualquer idéia sobre o que está errado é bem-vind
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();
}
});
}
}
StacktraceIsso faz parte do rastreamento da pilha, ele se repete ..
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 ...