[JIRA] Commented: (GLAZEDLISTS-475) IndexOutOfBoundsException when changing a filter using a JideTable under 1.8.0

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[JIRA] Commented: (GLAZEDLISTS-475) IndexOutOfBoundsException when changing a filter using a JideTable under 1.8.0

JIRA jira-no-reply@java.net

    [ https://java.net/jira/browse/GLAZEDLISTS-475?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=372851#action_372851 ]

brands commented on GLAZEDLISTS-475:
------------------------------------

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.

> IndexOutOfBoundsException when changing a filter using a JideTable under 1.8.0
> ------------------------------------------------------------------------------
>
>                 Key: GLAZEDLISTS-475
>                 URL: https://java.net/jira/browse/GLAZEDLISTS-475
>             Project: glazedlists
>          Issue Type: Bug
>          Components: swing
>    Affects Versions: current
>         Environment: Operating System: other
> Platform: PC
>            Reporter: actualsystems
>            Assignee: jessewilson
>             Fix For: milestone 1
>
>
> 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

--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://java.net/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira