📄 jxlist.java
字号:
* disable again. * * see Issue #2-swinglabs. * * @param enabled */ public void setFilterEnabled(boolean enabled) { boolean old = isFilterEnabled(); if (old == enabled) return; filterEnabled = enabled; if (!old) { wrappingModel = new WrappingListModel(getModel()); super.setModel(wrappingModel); } else { ListModel model = wrappingModel.getModel(); wrappingModel = null; super.setModel(model); } } public boolean isFilterEnabled() { return filterEnabled; } /** * set's the underlying data model. Note that if isFilterEnabled you must * call getWrappedModel to access the model given here. In this case * getModel returns a wrapper around the data! * * * */ public void setModel(ListModel model) { if (isFilterEnabled()) { wrappingModel.setModel(model); } else { super.setModel(model); } } private Selection getSelection() { if (selection == null) { selection = new Selection(filters, getSelectionModel()); } return selection; } public FilterPipeline getFilters() { if ((filters == null) && isFilterEnabled()) { setFilters(null); } return filters; } /** Sets the FilterPipeline for filtering table rows. * PRE: isFilterEnabled() * * @param pipeline the filterPipeline to use. * @throws IllegalStateException if !isFilterEnabled() */ public void setFilters(FilterPipeline pipeline) { if (!isFilterEnabled()) throw new IllegalStateException("filters not enabled - not allowed to set filters"); FilterPipeline old = filters; Sorter sorter = null; if (old != null) { old.removePipelineListener(pipelineListener); sorter = old.getSorter(); } if (pipeline == null) { pipeline = new FilterPipeline(); } filters = pipeline; filters.setSorter(sorter); use(filters); getSelection().setFilters(filters); } /** * setModel() and setFilters() may be called in either order. * * @param pipeline */ private void use(FilterPipeline pipeline) { if (pipeline != null) { // check JW: adding listener multiple times (after setModel)? if (initialUse(pipeline)) { pipeline.addPipelineListener(getFilterPipelineListener()); pipeline.assign(getComponentAdapter()); } else { pipeline.flush(); } } } /** * @return true is not yet used in this JXTable, false otherwise */ private boolean initialUse(FilterPipeline pipeline) { if (pipelineListener == null) return true; PipelineListener[] l = pipeline.getPipelineListeners(); for (int i = 0; i < l.length; i++) { if (pipelineListener.equals(l[i])) return false; } return true; } /** returns the listener for changes in filters. */ protected PipelineListener getFilterPipelineListener() { if (pipelineListener == null) { pipelineListener = createPipelineListener(); } return pipelineListener; } /** creates the listener for changes in filters. */ protected PipelineListener createPipelineListener() { PipelineListener l = new PipelineListener() { public void contentsChanged(PipelineEvent e) { updateOnFilterContentChanged(); } }; return l; } /** * method called on change notification from filterpipeline. */ protected void updateOnFilterContentChanged() { // make the wrapper listen to the pipeline? if (wrappingModel != null) { wrappingModel.updateOnFilterContentChanged(); } revalidate(); repaint(); } private class WrappingListModel extends AbstractListModel { private ListModel delegate; private ListDataListener listDataListener; public WrappingListModel(ListModel model) { setModel(model); } public void updateOnFilterContentChanged() { fireContentsChanged(this, -1, -1); } public void setModel(ListModel model) { ListModel old = this.getModel(); if (old != null) { old.removeListDataListener(listDataListener); } this.delegate = model; delegate.addListDataListener(getListDataListener()); fireContentsChanged(this, -1, -1); } private ListDataListener getListDataListener() { if (listDataListener == null) { listDataListener = createListDataListener(); } return listDataListener; } private ListDataListener createListDataListener() { ListDataListener l = new ListDataListener() { public void intervalAdded(ListDataEvent e) { contentsChanged(e); } public void intervalRemoved(ListDataEvent e) { contentsChanged(e); } public void contentsChanged(ListDataEvent e) { getSelection().lock(); fireContentsChanged(this, -1, -1); updateSelection(e); getFilters().flush(); } }; return l; } protected void updateSelection(ListDataEvent e) { if (e.getType() == ListDataEvent.INTERVAL_REMOVED) { getSelection() .removeIndexInterval(e.getIndex0(), e.getIndex1()); } else if (e.getType() == ListDataEvent.INTERVAL_ADDED) { int minIndex = Math.min(e.getIndex0(), e.getIndex1()); int maxIndex = Math.max(e.getIndex0(), e.getIndex1()); int length = maxIndex - minIndex + 1; getSelection().insertIndexInterval(minIndex, length, true); } else { getSelection().clearModelSelection(); } } public ListModel getModel() { return delegate; } public int getSize() { return getFilters().getOutputSize(); } public Object getElementAt(int index) { return getFilters().getValueAt(index, 0); } } // ---------------------------- uniform data model protected ComponentAdapter getComponentAdapter() { if (dataAdapter == null) { dataAdapter = new ListAdapter(this); } return dataAdapter; } protected static class ListAdapter extends ComponentAdapter { private final JXList list; /** * Constructs a <code>ListDataAdapter</code> for the specified target * component. * * @param component * the target component */ public ListAdapter(JXList component) { super(component); list = component; } /** * Typesafe accessor for the target component. * * @return the target component as a {@link org.jdesktop.swingx.JXList} */ public JXList getList() { return list; } /** * {@inheritDoc} */ public boolean hasFocus() { /** @todo Think through printing implications */ return list.isFocusOwner() && (row == list.getLeadSelectionIndex()); } public int getRowCount() { return list.getWrappedModel().getSize(); } /** * {@inheritDoc} */ public Object getValueAt(int row, int column) { return list.getWrappedModel().getElementAt(row); } public Object getFilteredValueAt(int row, int column) { return list.getElementAt(row); } public void setValueAt(Object aValue, int row, int column) { throw new UnsupportedOperationException( "Method getFilteredValueAt() not yet implemented."); } public boolean isCellEditable(int row, int column) { return false; } /** * {@inheritDoc} */ public boolean isSelected() { /** @todo Think through printing implications */ return list.isSelectedIndex(row); } public String getColumnName(int columnIndex) { return "Column_" + columnIndex; } public String getColumnIdentifier(int columnIndex) { return null; } } // ------------------------------ renderers public HighlighterPipeline getHighlighters() { return highlighters; } /** Assigns a HighlighterPipeline to the table. */ public void setHighlighters(HighlighterPipeline pipeline) { HighlighterPipeline old = getHighlighters(); if (old != null) { old.removeChangeListener(getHighlighterChangeListener()); } highlighters = pipeline; if (highlighters != null) { highlighters.addChangeListener(getHighlighterChangeListener()); } firePropertyChange("highlighters", old, getHighlighters()); } private ChangeListener getHighlighterChangeListener() { if (highlighterChangeListener == null) { highlighterChangeListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { repaint(); } }; } return highlighterChangeListener; } private DelegatingRenderer getDelegatingRenderer() { if (delegatingRenderer == null) { // only called once... to get hold of the default? delegatingRenderer = new DelegatingRenderer(super.getCellRenderer()); } return delegatingRenderer; } public ListCellRenderer getCellRenderer() { return getDelegatingRenderer(); } public void setCellRenderer(ListCellRenderer renderer) { // JW: Pending - probably fires propertyChangeEvent with wrong newValue? // how about fixedCellWidths? // need to test!! getDelegatingRenderer().setDelegateRenderer(renderer); super.setCellRenderer(delegatingRenderer); } private class DelegatingRenderer implements ListCellRenderer { private LinkRenderer linkRenderer; private ListCellRenderer delegateRenderer; public DelegatingRenderer(ListCellRenderer delegate) { setDelegateRenderer(delegate); } public void setDelegateRenderer(ListCellRenderer delegate) { if (delegate == null) { delegate = new DefaultListCellRenderer(); } delegateRenderer = delegate; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component comp = null; if (value instanceof LinkModel) { comp = getLinkRenderer().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } else { comp = delegateRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } if (highlighters != null) { ComponentAdapter adapter = getComponentAdapter(); adapter.column = 0; adapter.row = index; comp = highlighters.apply(comp, adapter); } return comp; } private LinkRenderer getLinkRenderer() { if (linkRenderer == null) { linkRenderer = new LinkRenderer(); } return linkRenderer; } public void setLinkVisitor(ActionListener linkVisitor) { getLinkRenderer().setVisitingDelegate(linkVisitor); } public void updateUI() { updateRendererUI(linkRenderer); updateRendererUI(delegateRenderer); } private void updateRendererUI(ListCellRenderer renderer) { if (renderer instanceof JComponent) { ((JComponent) renderer).updateUI(); } else if (renderer != null) { Component comp = renderer.getListCellRendererComponent( JXList.this, null, -1, false, false); if (comp instanceof JComponent) { ((JComponent) comp).updateUI(); } } } } // --------------------------- updateUI public void updateUI() { super.updateUI(); updateRendererUI(); } private void updateRendererUI() { if (delegatingRenderer != null) { delegatingRenderer.updateUI(); } else { ListCellRenderer renderer = getCellRenderer(); if (renderer instanceof JComponent) { ((JComponent) renderer).updateUI(); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -