Salve, ho un problema con il mio programma.. io uso Netbeans 8.0 e mi serve fare una ricerca evidenziando le parole in una jTable, filtrando così i prodotti inseriti all'interno. Utilizzo il metodo "fireDocumentChangeEvent", il problema è che quando l'user fa il login, entrando nella tab dei prodotti l'opzione ricerca funziona e si evidenzia solo la parola scritta in una jTextField, ma quando l'user non fa il login la ricerca va in tilt e quando scrivo la parola, le lettere sono a metà e appaiono spazi bianchi, mentre nella consolle si presenta tale errore:

codice:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 39 >= 20	at java.util.Vector.elementAt(Vector.java:470)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650)
	at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getValueAt(TableRowSorter.java:269)
	at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getStringValueAt(TableRowSorter.java:285)
	at javax.swing.DefaultRowSorter$FilterEntry.getStringValue(DefaultRowSorter.java:1352)
	at javax.swing.RowFilter$RegexFilter.include(RowFilter.java:447)
	at javax.swing.RowFilter$GeneralFilter.include(RowFilter.java:421)
	at javax.swing.DefaultRowSorter.include(DefaultRowSorter.java:931)
	at javax.swing.DefaultRowSorter.initializeFilteredMapping(DefaultRowSorter.java:640)
	at javax.swing.DefaultRowSorter.sort(DefaultRowSorter.java:592)
	at javax.swing.DefaultRowSorter.setRowFilter(DefaultRowSorter.java:424)
	at cavonline_client.GUI.GUI_utente.utilities.RicercaProdotti.fireDocumentChangeEvent(RicercaProdotti.java:52)
	at cavonline_client.GUI.GUI_utente.HomeUtente$24.insertUpdate(HomeUtente.java:1173)
	at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:202)
	at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:749)
	at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:708)
	at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
	at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:670)
	at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1379)
	at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:884)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2878)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2925)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2841)
	at java.awt.Component.processEvent(Component.java:6282)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
	at java.awt.Component.dispatchEventImpl(Component.java:4731)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Invece questa è la classe che utilizzo per la ricerca dei prodotti:

codice:
public class RicercaProdotti {    
    protected static final Color WARNING_COLOR = new Color(255, 200, 200);
    
    public static HighlightTableCellRenderer renderer = new HighlightTableCellRenderer();
    
    public final transient static TableRowSorter<? extends TableModel> sorter = new TableRowSorter<>(table3);
    
    //metodo per la ricerca
    public static void fireDocumentChangeEvent() {
        HomeUtente.ricerca.setBackground(Color.WHITE);
        String pattern = HomeUtente.ricerca.getText().trim();
        
        if (pattern.isEmpty()) {
            sorter.setRowFilter(null);
            renderer.setPattern("");
            
        } else if (renderer.setPattern(pattern)) {
            
            try {
                sorter.setRowFilter(RowFilter.regexFilter(pattern));
            } catch (PatternSyntaxException ex) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
}


    class HighlightTableCellRenderer extends JTextField implements TableCellRenderer {
    
    private  final Color BACKGROUND_SELECTION_COLOR = new Color(220, 240, 255);
    private final transient Highlighter.HighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
    private String pattern = "";
    private String prev;


    public boolean setPattern(String str) {
        
        if (str == null || str.equals(pattern)) {
            return false;
            
        } else {
            
            prev = pattern;
            pattern = str;
            return true;
        }
    }
    
    public HighlightTableCellRenderer() {
        
        super();
        setOpaque(true);
        setBorder(BorderFactory.createEmptyBorder());
        setForeground(Color.BLACK);
        setBackground(Color.WHITE);
        setEditable(false);
    }
    @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        
        String txt = Objects.toString(value, "");
        Highlighter highlighter = getHighlighter();
        highlighter.removeAllHighlights();
        setText(txt);
        setBackground(isSelected ? BACKGROUND_SELECTION_COLOR : Color.WHITE);
        
        if (pattern != null && !pattern.isEmpty() && !pattern.equals(prev)) {
            
            Matcher matcher = Pattern.compile(pattern).matcher(txt);
            
            if (matcher.find()) {
                
                int start = matcher.start();
                int end   = matcher.end();
                
                try {
                    highlighter.addHighlight(start, end, highlightPainter);
                    
                } catch (BadLocationException | PatternSyntaxException e) {
                }
            }
        }
        return this;
    }
}

Quando clicco sull'errore, la riga presa in considerazione è questa:
codice:
sorter.setRowFilter(RowFilter.regexFilter(pattern));
Grazie e spero possiate risolvere questo errore