⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sortedtablemodel.java

📁 化学图形处理软件
💻 JAVA
字号:
/* $RCSfile$ * $Author: egonw $ * $Date: 2007-01-04 18:26:00 +0100 (Thu, 04 Jan 2007) $ * $Revision: 7634 $ * * Copyright (C) 2002-2003  The Jmol Development Team * Copyright (C) 2003-2007  The Chemistry Development Kit (CDK) Project * * Contact: cdk-devel@lists.sourceforge.net * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Lesser General Public *  License as published by the Free Software Foundation; either *  version 2.1 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Lesser General Public License for more details. * *  You should have received a copy of the GNU Lesser General Public *  License along with this library; if not, write to the Free Software *  Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */package org.openscience.cdk.applications.swing;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeSupport;import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.List;import javax.swing.JTable;import javax.swing.event.TableModelEvent;import javax.swing.table.TableColumnModel;import javax.swing.table.TableModel;/** *  A sorted table model. The objects in the model must implement the Comparable *  interface. * * @cdk.module applications * @cdk.require swing * * @author Bradley A. Smith <bradley@baysmith.com> */public class SortedTableModel extends ListeningTableModel {    private static final long serialVersionUID = -8517584055155609668L;        Integer[] indexes;  List sortingColumns = new ArrayList();  boolean ascending = true;  public SortedTableModel(TableModel model) {    super(model);    initializeIndexes();  }  public void initializeIndexes() {    indexes = new Integer[model.getRowCount()];    for (int row = 0; row < indexes.length; ++row) {      indexes[row] = new Integer(row);    }  }  public void tableChanged(TableModelEvent e) {    initializeIndexes();    super.tableChanged(e);  }  void sort() {    Arrays.sort(indexes,                new Comparator() {                  public int compare(Object r1, Object r2) {                    int row1 = ((Integer) r1).intValue();                    int row2 = ((Integer) r2).intValue();                    int result = 0;                    int level = 0;                    while ((result == 0) && (level < sortingColumns.size())) {                      int column =                        ((Integer) sortingColumns.get(level)).intValue();                      Object o1 = model.getValueAt(row1, column);                      Object o2 = model.getValueAt(row2, column);                      if ((o1 == null) && (o2 == null)) {                        // Null objects are equal.                        return 0;                      } else if (o1 == null) {                        // Null is less than anything.                        return -1;                      } else if (o2 == null) {                        // Anything is greather than null.                        return 1;                      }                      result = ((Comparable) o1).compareTo(o2);                      ++level;                    }                    if (!ascending) {                      result = -result;                    }                    return result;                  }                });  }  /**   *  Returns the object at the given indices.   */  public Object getValueAt(int aRow, int aColumn) {    return model.getValueAt(indexes[aRow].intValue(), aColumn);  }  public int getSortedIndex(int aRow) {      return indexes[aRow].intValue();  }    /**   *  Sets the object at the given indices.   */  public void setValueAt(Object aValue, int aRow, int aColumn) {    model.setValueAt(aValue, indexes[aRow].intValue(), aColumn);  }  public int getSortedColumn() {    if (sortingColumns.size() > 0) {      return ((Integer) sortingColumns.get(0)).intValue();    }    return -1;  }  public boolean isAscending() {    return ascending;  }  public void sortByColumn(int column) {    sortByColumn(column, true);  }  public void sortByColumn(int column, boolean ascending) {    Integer oldSortColumn = null;    if (sortingColumns.size() > 0) {      oldSortColumn = (Integer) sortingColumns.get(0);    }    Boolean oldSortDirection = new Boolean(this.ascending);    this.ascending = ascending;    Integer newSortColumn = new Integer(column);    sortingColumns.add(0, newSortColumn);    // Limit size of sorting columns so that it doesn't grow forever.    while (sortingColumns.size() > model.getColumnCount()) {      sortingColumns.remove(sortingColumns.size() - 1);    }    sort();    super.tableChanged(new TableModelEvent(this));    changeSupport.firePropertyChange("sortColumn", oldSortColumn,        newSortColumn);    Boolean newSortDirection = new Boolean(ascending);    changeSupport.firePropertyChange("sortDirection", oldSortDirection,        newSortDirection);  }  /**   *  Adds a mouse listener to the given Table for sorting a column   *  when the heading is clicked.  When the sorted column is clicked,   *  the sort order alternates between ascending and descending.   */  public void addMouseListenerToHeaderInTable(final JTable table) {    table.setColumnSelectionAllowed(false);    MouseAdapter listMouseListener = new MouseAdapter() {      boolean order = true;      public void mouseClicked(MouseEvent e) {        TableColumnModel columnModel = table.getColumnModel();        int viewColumn = columnModel.getColumnIndexAtX(e.getX());        int column = table.convertColumnIndexToModel(viewColumn);        if ((e.getClickCount() == 1) && (column != -1)) {          if (getSortedColumn() == column) {            order = !order;          }          sortByColumn(column, order);        }      }    };    table.getTableHeader().addMouseListener(listMouseListener);  }  public void addPropertyChangeListener(PropertyChangeListener listener) {    changeSupport.addPropertyChangeListener(listener);  }  public void removePropertyChangeListener(PropertyChangeListener listener) {    changeSupport.removePropertyChangeListener(listener);  }  private PropertyChangeSupport changeSupport =    new PropertyChangeSupport(this);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -