coderazzi / tablefilter-swing

TableFilter is a set of Swing components to support user-driven filtering on table.
https://coderazzi.net/tablefilter
MIT License
7 stars 2 forks source link

Adaptive choices disabled and ChoiceRenderer interaction #10

Closed coderazzi closed 9 years ago

coderazzi commented 13 years ago

Original report by Anonymous.


Because of an issues with adaptive choices (see Defect 8),
I disabled the adaptive choices. 
In one column of my table I use ChoiceRenderer to filter the data. 

I noticed that if the disable of adaptive choices comes AFTER setting the ChoiceRenderer,
the choice renderer doesn't display any choices.
If adaptive choices are disabled BEFORE setting of ChoiceRenderer,
the choice renderer works fine.

This code causes choice renderer not to work:
filterHeader.getFilterEditor(EventsTableModel.COLUMN_LEVEL).setRenderer(new LevelChoiceRenderer());
filterHeader.setAdaptiveChoices(false);

This code works corectly:
filterHeader.setAdaptiveChoices(false);
filterHeader.getFilterEditor(EventsTableModel.COLUMN_LEVEL).setRenderer(new LevelChoiceRenderer());

I'm using version 4.1.1 of filters.
I don't know whether it is a bug or made intentionally,
so let me know.

Best regards,
Polina.

Original issue reported on code.google.com by pulke83 on 2011-03-17 08:24:42

coderazzi commented 13 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Hi, Polina,

I have played with the example delivered with the normal release (http://coderazzi.net/tablefilter/download/example.jnlp),
and setting the adaptive choices to false has no impact on the ChoiceRenderer used
on the Country column.

I have tried several scenarios (setting/unsetting them in different order), but I cannot
replicate the behavior you mention.

I have also created a specific example for it, still unable to replicate the behavior.

Could you please send me some source code with the offending code, to find the root
of the problem? That would be great.

Best regards,

  Lu.

Original issue reported on code.google.com by coderazzi on 2011-03-20 23:15:39

coderazzi commented 13 years ago

Original comment by Anonymous.



Hi, Lu,

here are the relevant parts of the code you asked.

Best regards,
Polina.

/**
 * This is a class that represents Events screen
 * @author polinan
 *
 */
@SuppressWarnings("serial")
public class EventsPanel extends XnPanel{

    /**
     * Components
     */
    private JXTable eventsTable;
    private TableFilterHeader filterHeader;
    private JLabel numRows = getTitleLabel(NUM_ROWS + "0");
    private EventsTableModel eventsTableModel;

    /**
     * Constants
     */
    private static final Icon NEW_NOT_SEL_ICON = IconLoader.getIcon(IconLoader.newBtn_notSelected);
    private static final Icon NEW_SEL_ICON = IconLoader.getIcon(IconLoader.newBtn_selected);
    private static final String NUM_ROWS = "Number of rows: ";

    /**
     * Constructor
     */
    public EventsPanel (){
        // events table settings
        eventsTable = new JXTable();

        eventsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        eventsTable.setOpaque(false);
        eventsTable.setEditable(false);

        eventsTable.addMouseListener(new EventsMouseListener());
        eventsTable.setDefaultRenderer(Object.class, new EventsCellRenderer());
        eventsTable.setDefaultRenderer(Date.class, new EventsCellRenderer());

        initTableFilter();
        refreshTable();

        JScrollPane eventsSP = new JScrollPane();
        eventsSP.setViewportView(eventsTable);

        JPanel tableWithRowsLabelPanel = new XnPanel();
        tableWithRowsLabelPanel.setLayout(new BoxLayout(tableWithRowsLabelPanel, BoxLayout.Y_AXIS));
        tableWithRowsLabelPanel.add(eventsSP);
        tableWithRowsLabelPanel.add(numRows);
        eventsSP.setAlignmentX(LEFT_ALIGNMENT);
        numRows.setAlignmentX(LEFT_ALIGNMENT);
        numRows.setBorder(BorderFactory.createEmptyBorder(0,10,2,0));

        XnTitledPanel temp = new XnTitledPanel("", tableWithRowsLabelPanel,XnTitledPanelType.DETAIL);
        temp.addComponentToTitle(getRefreshScreenButton());
        temp.addComponentToTitle(new SetRefreshEventsTimeBtn());
        XnTitledPanel dataPanel = new XnTitledPanel("Events", temp);

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        add(dataPanel);

    }

    /**
     * This function inits table filter
     */
    private void initTableFilter() {
        SimpleDateFormat dateFormat = new SimpleDateFormat(MgmtConstants.DD_MM_YYYY_HH_MM_SS);
        FilterSettings.dateFormat = MgmtConstants.DD_MM_YYYY_HH_MM_SS;
        // adding filter header to contactsTable 
        filterHeader = new TableFilterHeader(eventsTable);

    }

    /**
     * This function makes all customizations of the table filter
     */
    private void customizeFilter() {

        //set auto options for several colums
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_LEVEL).setAutoChoices(AutoChoices.ENABLED);
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_TYPE).setAutoChoices(AutoChoices.ENABLED);

        int maxHist_5 = 5;
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_LEVEL).setMaxHistory(0);
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_TYPE).setMaxHistory(0);
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_DATE).setMaxHistory(maxHist_5);
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_DESCR).setMaxHistory(maxHist_5);

        filterHeader.setSelectionBackground(Color.white);
        filterHeader.setSelectionForeground(Color.black);
        filterHeader.setFilterOnUpdates(true);
//      filterHeader.setAdaptiveChoices(false); //OK
        filterHeader.getFilterEditor(EventsTableModel.COLUMN_LEVEL).setRenderer(new LevelChoiceRenderer());
        filterHeader.setAdaptiveChoices(false); //NOT OK

    }

    /**
     * This function is called in order to refresh table data
     */
    private void refreshTable(){

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                if(eventsTableModel == null){
                    eventsTableModel = new EventsTableModel();
                    eventsTable.setModel(eventsTableModel);
                }
                else{
                    EventsTableModel eventsTableModel = (EventsTableModel)eventsTable.getModel();
                    eventsTableModel.retrieveData();
                }

                customizeFilter();
                resizeColumns();
                numRows.setText(NUM_ROWS + eventsTable.getModel().getRowCount());

                //the filter has bug, if the table model is empty after clicking the filter editor
we get nullpointer exception
                //that's why we disable filter after table model is changed
                boolean enableFilter = (eventsTable.getModel().getRowCount() != 0);
                filterHeader.setEnabled(enableFilter);
                UIUtils.selectRowAfterRefreshTable(eventsTable);
            }

        });

    }

    /**
     * This function returns icon of event level
     * @param pLevel
     * @return
     */
    private Icon getLevelIcon(CoreDefs.Level pLevel){
        String iconPath;
        switch (pLevel){
            case LEVEL_INFO:
                iconPath = IconLoader.ev_level_info;
                break;
            case LEVEL_WARN:
                iconPath = IconLoader.ev_level_warning;
                break;
            case LEVEL_ERROR:
                iconPath = IconLoader.ev_level_error;
                break;
            case LEVEL_DEBUG:
                iconPath = IconLoader.ev_level_info;
                break;
            case LEVEL_FATAL:
                iconPath = IconLoader.ev_level_error;
                break;
            case LEVEL_TRACE:
                iconPath = IconLoader.ev_level_info;
                break;
            default:
                iconPath = IconLoader.ev_level_info;

        }
        return IconLoader.getIcon(iconPath);
    }

    private JButton getRefreshScreenButton(){
        JButton refreshBtn = new XnButton(NEW_SEL_ICON,NEW_NOT_SEL_ICON);
        refreshBtn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                refreshTable();
            }

        });

        return refreshBtn;
    }
    private class LevelChoiceRenderer implements ChoiceRenderer {

        @Override
        public Component getRendererComponent(IFilterEditor editor,
                Object value, boolean isSelected) {
            JLabel renderer = new JLabel();
            renderer.setOpaque(true);
            renderer.setIcon(getLevelIcon((CoreDefs.Level)value));
            return renderer;
        }

    }

}

Original issue reported on code.google.com by pulke83 on 2011-03-21 09:51:11

coderazzi commented 13 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Hi, Polina, 

The code seems alright, although I lack many of the associated class (specially the
EventTableModel class; can you attach it as well?).

One question, which is exactly the behavior that you are experimenting when you invoke
setAdaptiveOptions(false) before? The editor associated to the COLUMN_LEVEL column
contains entries, but they are not rendered as expected?

Best regards,

 Lu.

Original issue reported on code.google.com by coderazzi on 2011-03-21 13:39:20

coderazzi commented 13 years ago

Original comment by Anonymous.


Exactly, see the print screens attached.

import java.util.Date;
import java.util.Vector;

import javax.swing.table.DefaultTableModel;

import com.xn.gui.communication.GUIDataProvider;
import com.xn.mgmt_proc.mgmt_parser.converter.DateParamConverter;
import com.xn.proto_gen.CoreDefs;
import com.xn.proto_gen.CoreDefs.Event;
/**
 * This is implementation of Events table model, used in {@link EventsPanel}
 * @author polinan
 *
 */
@SuppressWarnings("serial")
public class EventsTableModel extends DefaultTableModel {

    /**
     * Constants
     */
    public static final int COLUMN_LEVEL = 0;
    public static final int COLUMN_DATE = 1;
    public static final int COLUMN_TYPE = 2;
    public static final int COLUMN_DESCR = 3;

    private GUIDataProvider dataProvider;
    private DateParamConverter dateConverter = new DateParamConverter();

    /**
     * Constructor
     */
    EventsTableModel() {
        super();
        dataProvider = new GUIDataProvider();
        dataVector = new Vector<Event>();
        retrieveData();
    }

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public int getRowCount() {
        return dataVector.size();
    }

    @Override
    public Object getValueAt(int row, int col) {
        Event eventObj = (Event) dataVector.get(row);
        switch (col) {

        case COLUMN_LEVEL:
            return eventObj.getLevel();
        case COLUMN_DATE:
            return dateConverter.convertToDate(eventObj.getTimestamp());
        case COLUMN_TYPE:
            return eventObj.getEventType();
        case COLUMN_DESCR:
            return eventObj.getFormattedDescr();

        default:
            assert false;
        }
        return null;
    }

    @Override
    public Class<?> getColumnClass(int col) {
        switch (col) {

        case COLUMN_LEVEL:
            return CoreDefs.Level.class;
        case COLUMN_DATE:
            return Date.class;
        case COLUMN_TYPE:
            return CoreDefs.EventType.class;
        case COLUMN_DESCR:
            return String.class;

        default:
            assert false;
        }
        return null;
    }

    @Override
    public String getColumnName(int col) {

        switch (col) {

        case COLUMN_LEVEL:
            return "";
        case COLUMN_DATE:
            return "Date";
        case COLUMN_TYPE:
            return "Type";
        case COLUMN_DESCR:
            return "Description";

        default:
            assert false;
        }
        return null;

    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return false;
    }

    public CoreDefs.Event getEventByRow(int row){
        return (CoreDefs.Event)dataVector.get(row);
    }

    public void retrieveData(){
        dataVector.clear();
        dataVector.addAll(dataProvider.getEventsList());
        fireTableDataChanged();

    }

}

Original issue reported on code.google.com by pulke83 on 2011-03-22 09:15:40


coderazzi commented 13 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Hi, Polina, 

Well, there is something positive: what _seems_ to happen is that the editor has no
choices at all, not that the renderer is not working. 

In the table model, changes are propagated using fireTableDataChanged(), which was
being incorrectly handled (is the issue 8 that you submitted). So, the solution to
that problem _should_ solve also this problem.

I have some changes ready for a new delivery, that should improve performance for big
tables, so I will deliver a new version in a few hours. I expect it to have this problem
solved, otherwise I will get back to it!

Best regards,

  Lu.

Original issue reported on code.google.com by coderazzi on 2011-03-22 09:59:46

coderazzi commented 13 years ago

Original comment by Anonymous.


Hi, Lu,

happy to hear this,
I'll try to check the new version in my application as fast as possible :)

Original issue reported on code.google.com by pulke83 on 2011-03-22 10:09:44

coderazzi commented 13 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Hi, Polina,

I took me finally quite a longer time to release the new version (4.1.2).
It would be great if you can confirm me that your problems are now gone... Well, at
least the problems with the library :-)

Ciao!

  Lu.

Original issue reported on code.google.com by coderazzi on 2011-03-23 04:09:54

coderazzi commented 13 years ago

Original comment by Anonymous.


Thanks Lu,
everything seems to work, didn't see some unusual behavior.

Original issue reported on code.google.com by pulke83 on 2011-03-23 08:44:08

coderazzi commented 13 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Thanks, Polina, I close therefore the issue,

  Lu.

Original issue reported on code.google.com by coderazzi on 2011-03-23 15:54:36

coderazzi commented 9 years ago

Original comment by coderazzi coderazzi (Bitbucket: coderazzi, GitHub: coderazzi).


Already resolved (previously, before migrating to BitBucket)