jxTable Начальный порядок сортировки

1

Сначала я хотел бы отсортировать таблицу. Я пробовал следующий код:

tableModel = createTableModel(model);
rowSorter = new TableRowSorter<>(tableModel);
rowSorter.setSortKeys(Arrays.asList(getDefaultSort()));
rowSorter.sort();


final JXTable table = new JXTable();
table.setAutoCreateRowSorter(false);
table.setRowSorter(createSorter());

Когда я нажимаю столбец сортировки по умолчанию, он отлично работает, поэтому, похоже, нет никакой проблемы с фактической сортировкой. Но пользовательский интерфейс сначала не сортируется с указанным выше кодом, пользовательский интерфейс не показывает индикатор сортировки (этот маленький треугольник в заголовке столбца). Что мне не хватает?

Теги:
swing
swingx

3 ответа

3
Лучший ответ

Проблема может заключаться в том, что RowSorter установлен до установки TableModel. Однажды у меня была эта проблема.

0
DefaultRowSorter.toggleSortOrder( column );
  • 0
    Я попробовал это также, но это не имеет никакого эффекта.
  • 0
    @ morpheus05, у меня отлично работает. Разместите свой SSCCE, который демонстрирует проблему. Сначала попробуйте это с помощью JTable, чтобы увидеть, работают ли стандартные классы.
-1

Попробуйте сделать это Пример:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;

public class SortTable extends JFrame{
  protected JTable table = new JTable();

  protected TabModel tabmodel;

   public SortTable() {
    super();
    setSize(500, 200);

    tabmodel = new TabModel();

     table.setModel(tabmodel);

    JTableHeader header = table.getTableHeader();
    header.setUpdateTableInRealTime(true);
    header.addMouseListener(tabmodel.new ColumnListener(table));
    header.setReorderingAllowed(true);

    JScrollPane ps = new JScrollPane();
    ps.getViewport().add(table);
    getContentPane().add(ps, BorderLayout.CENTER);

    WindowListener wndCloser = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    };
    addWindowListener(wndCloser);
    setVisible(true);
  }

  public static void main(String argv[]) {
    new SortTable();
  }
}
class TabModel extends AbstractTableModel {
  protected int sortCol = 0;

  protected boolean isSortAsc = true;

  protected int m_result = 0;
  protected int columnsCount = 1;
  Vector vector = new Vector();
  public TabModel() {
    vector.removeAllElements();
    vector.addElement(new Integer(3));
    vector.addElement(new Integer(504));
    vector.addElement(new Integer(1));
    vector.addElement(new Integer(4));
    vector.addElement(new Integer(4));
    vector.addElement(new Integer(7));
    vector.addElement(new Integer(9));
    vector.addElement(new Integer(78));
    vector.addElement(new Integer(654));
    vector.addElement(new Integer(91));
    vector.addElement(new Integer(718));
    vector.addElement(new Integer(62254));
  }

  public int getRowCount() {
Collections.sort(vector,new TabComparator(isSortAsc)); 
        return vector == null ? 0 : vector.size();
  }

  public int getColumnCount() {
    return columnsCount;
  }

  public String getColumnName(int column) {
    String str = "data";
    if (column == sortCol)
      str += isSortAsc ? " >>" : " <<";
    return str;
  }

  public boolean isCellEditable(int nRow, int nCol) {
    return false;
  }

  public Object getValueAt(int nRow, int nCol) {
    if (nRow < 0 || nRow >= getRowCount())
      return "";
    if(nCol>1){
      return "";
    }
    return vector.elementAt(nRow);
  }

  public String getTitle() {
    return "data ";
  }

  class ColumnListener extends MouseAdapter {
    protected JTable table;

    public ColumnListener(JTable t) {
      table = t;
    }

    public void mouseClicked(MouseEvent e) {
      TableColumnModel colModel = table.getColumnModel();
      int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
      int modelIndex = colModel.getColumn(columnModelIndex)
          .getModelIndex();

      if (modelIndex < 0)
        return;
      if (sortCol == modelIndex)
        isSortAsc = !isSortAsc;
      else
        sortCol = modelIndex;

      for (int i = 0; i < columnsCount; i++) { 
        TableColumn column = colModel.getColumn(i);
        column.setHeaderValue(getColumnName(column.getModelIndex()));
      }
      table.getTableHeader().repaint();

      Collections.sort(vector,new TabComparator(isSortAsc));
      table.tableChanged(new TableModelEvent(TabModel.this));
      table.repaint();
    }
  }
}

class TabComparator implements Comparator {
  protected boolean isSortAsc;

  public TabComparator( boolean sortAsc) {
    isSortAsc = sortAsc;
  }

  public int compare(Object o1, Object o2) {
    if (!(o1 instanceof Integer) || !(o2 instanceof Integer))
      return 0;
    Integer s1 = (Integer) o1;
    Integer s2 = (Integer) o2;
    int result = 0;
    result = s1.compareTo(s2);
    if (!isSortAsc)
      result = -result;
    return result;
  }

  public boolean equals(Object obj) {
    if (obj instanceof TabComparator) {
        TabComparator compObj = (TabComparator) obj;
      return compObj.isSortAsc == isSortAsc;
    }
    return false;
  }
}
  • 0
    -1 сортировка таблиц встроена в API. Там нет необходимости для всего этого пользовательского кода.
  • 0
    Спасибо за ответ, но проблема не в самой сортировке, а в начальном состоянии сортировки, которое меня беспокоит.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню