glazedlists
  1. glazedlists
  2. GLAZEDLISTS-475

IndexOutOfBoundsException when changing a filter using a JideTable under 1.8.0

    Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: current
    • Fix Version/s: milestone 1
    • Component/s: swing
    • Labels:
      None
    • Environment:

      Operating System: other
      Platform: PC

    • Issuezilla Id:
      475

      Description

      Our test case uses JideTable from the Jide grids package:
      (http://www.jidesoft.com/javadoc/com/jidesoft/grid/JideTable.html)
      (jide-grids.jar and jide-common.jar).

      Tested using Windows Vista and a 32-bit JVM (1.6) and Jide-grids.jar version
      (from the MANIFEST.MF) Jide-Version: 2.1.2.02

      The following test case reproduces the problem, and changing t from being a
      JideTable to a JTable causes it not to occur. This test case works under
      GlazedLists 1.7.0.

      import ca.odell.glazedlists.*;
      import ca.odell.glazedlists.gui.TableFormat;
      import ca.odell.glazedlists.swing.*;
      import com.jidesoft.grid.JideTable;

      import javax.swing.*;
      import javax.swing.text.JTextComponent;
      import java.awt.*;
      import java.lang.reflect.InvocationTargetException;
      import java.util.List;

      /**

      • Test for a bug in Glazed Lists filtering
      • If a selection is on the screen, and the filter changes so that the selected
        row index no longer exists,
      • we get an IndexOutOfBoundsException
        */
        public class TestFilterBug implements Runnable {

      private static final EventList<String> base = new DebugList<String>();

      public static void main(String[] args) throws InvocationTargetException,
      InterruptedException {
      SwingUtilities.invokeLater(new TestFilterBug());

      Thread.sleep(500); // show window

      base.getReadWriteLock().writeLock().lock();
      try

      { base.add("C"); base.add("B"); base.add("A"); }

      finally

      { base.getReadWriteLock().writeLock().unlock(); }

      }

      public void run() {
      try {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JTable t = new JideTable();
      f.getContentPane().setLayout(new BorderLayout());
      JTextComponent filter = new JTextField();
      f.getContentPane().add(filter, BorderLayout.NORTH);
      f.getContentPane().add(new JScrollPane(t), BorderLayout.CENTER);

      FilterList<String> filtered = new FilterList<String>(base, new
      TextComponentMatcherEditor<String>(filter, new TextFilterator<String>() {
      public void getFilterStrings(List<String> baseList, String
      element)

      { baseList.add(element); }

      }));
      f.pack();

      t.setModel(new EventTableModel<String>(filtered, new
      TableFormat<String>() {
      public int getColumnCount()

      { return 3; }

      public String getColumnName(int column)

      { return "X"; }

      public Object getColumnValue(String baseObject, int column)

      { return baseObject + column; }

      }));

      t.setSelectionModel(new EventSelectionModel<String>(filtered));

      f.setVisible(true);

      Thread.sleep(1000); // wait for list

      t.getSelectionModel().setSelectionInterval(2, 2);

      filter.setText("X");
      } catch (Throwable t)

      { System.out.println(t.getMessage()); t.printStackTrace(); System.exit(0); }

      }

      }

      Program output:

      Index: 2, Size: 0
      java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
      at java.util.ArrayList.RangeCheck(ArrayList.java:547)
      at java.util.ArrayList.get(ArrayList.java:322)
      at
      ca.odell.glazedlists.impl.gui.ThreadProxyEventList.get(ThreadProxyEventList.java:136)
      at ca.odell.glazedlists.ListSelection.setAllColor(ListSelection.java:544)
      at ca.odell.glazedlists.ListSelection.deselectAll(ListSelection.java:524)
      at
      ca.odell.glazedlists.ListSelection.setAnchorSelectionIndex(ListSelection.java:799)
      at
      ca.odell.glazedlists.swing.EventSelectionModel.setAnchorSelectionIndex(EventSelectionModel.java:314)
      at com.jidesoft.grid.JideTable.d(Unknown Source)
      at com.jidesoft.grid.JideTable.b(Unknown Source)
      at com.jidesoft.grid.JideTable.tableChanged(Unknown Source)
      at
      javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
      at
      ca.odell.glazedlists.swing.EventTableModel.handleListChange(EventTableModel.java:189)
      at ca.odell.glazedlists.swing.EventTableModel.listChanged(EventTableModel.java:170)
      at
      ca.odell.glazedlists.event.ListEventAssembler$ListEventFormat.fire(ListEventAssembler.java:412)
      at
      ca.odell.glazedlists.event.ListEventAssembler$ListEventFormat.fire(ListEventAssembler.java:409)
      at
      ca.odell.glazedlists.event.SequenceDependenciesEventPublisher$SubjectAndListener.firePendingEvent(SequenceDependenciesEventPublisher.java:445)
      at
      ca.odell.glazedlists.event.SequenceDependenciesEventPublisher.fireEvent(SequenceDependenciesEventPublisher.java:344)
      at
      ca.odell.glazedlists.event.ListEventAssembler.commitEvent(ListEventAssembler.java:316)
      at ca.odell.glazedlists.FilterList.constrained(FilterList.java:389)
      at ca.odell.glazedlists.FilterList.changeMatcher(FilterList.java:286)
      at ca.odell.glazedlists.FilterList.changeMatcherWithLocks(FilterList.java:269)
      at ca.odell.glazedlists.FilterList.access$100(FilterList.java:51)
      at
      ca.odell.glazedlists.FilterList$PrivateMatcherEditorListener.changedMatcher(FilterList.java:443)
      at
      ca.odell.glazedlists.matchers.AbstractMatcherEditor.fireChangedMatcher(AbstractMatcherEditor.java:115)
      at
      ca.odell.glazedlists.matchers.AbstractMatcherEditor.fireConstrained(AbstractMatcherEditor.java:73)
      at
      ca.odell.glazedlists.matchers.TextMatcherEditor.setTextMatcher(TextMatcherEditor.java:321)
      at
      ca.odell.glazedlists.matchers.TextMatcherEditor.setFilterText(TextMatcherEditor.java:292)
      at
      ca.odell.glazedlists.swing.TextComponentMatcherEditor.refilter(TextComponentMatcherEditor.java:209)
      at
      ca.odell.glazedlists.swing.TextComponentMatcherEditor.access$100(TextComponentMatcherEditor.java:44)
      at
      ca.odell.glazedlists.swing.TextComponentMatcherEditor$FilterHandler.insertUpdate(TextComponentMatcherEditor.java:221)
      at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:185)
      at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:734)
      at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)
      at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
      at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)
      at javax.swing.text.JTextComponent.setText(JTextComponent.java:1693)
      at
      com.actual_systems.p2.client.GUI.workordermanager.TestFilterBug.run(TestFilterBug.java:86)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
      at
      java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
      at
      java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

      Process finished with exit code 0

      1. SwingThreadProxyEventList.java
        1 kB
        brands
      2. TestFilterBug.java
        4 kB
        brands
      3. ThreadProxyEventList.java
        9 kB
        brands

        Activity

        Hide
        brands added a comment -

        A knwon workaround is to use another (older) ThreadProxyEventList implementation when using JideTable.
        I'll attach the source files for it and an updated example that should work.
        The implementation used here doesn't incorporate the changes made because of GLAZEDLISTS-447.

        You also have to ensure that the TableModel and SelectionModel use a different ThreadProxyEventList instance.

        Show
        brands added a comment - A knwon workaround is to use another (older) ThreadProxyEventList implementation when using JideTable. I'll attach the source files for it and an updated example that should work. The implementation used here doesn't incorporate the changes made because of GLAZEDLISTS-447 . You also have to ensure that the TableModel and SelectionModel use a different ThreadProxyEventList instance.
        Hide
        brands added a comment -

        Java source files demonstrating the workaround.

        Show
        brands added a comment - Java source files demonstrating the workaround.

          People

          • Assignee:
            jessewilson
            Reporter:
            actualsystems
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated: