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