0

When I click columns, the sorted results are wrong:

The sorted results

Here is my code:

DefaultTableModel tableModel = new DefaultTableModel(data, columns) {

        @Override
        public boolean isCellEditable(int row, int column) {
            //all cells false
            return false;
        }
    };
    JTable table = new JTable();
    table.setModel(tableModel);

    //Sort table
    table.setAutoCreateRowSorter(true);

Here is code for columns and data:
couponArray: It is Object

        // Columns of table
    String[] columns = {"Name of Coupon Provider", "Name of product", "Price of product",
            "Discount rate of the coupon (%)", "Final price", "Expiration Period", "Status of a coupon"};

    //Data of table
    int lengthArray = couponArray.size();
    String data[][] = new String [lengthArray][7];
    for (int i = 0; i < lengthArray; i++){
        Coupon sTmp = (Coupon)couponArray.get(i);
        data[i][0] = sTmp.getNameOfCouponProvider();
        data[i][1] = sTmp.getNameOfProduct();
        data[i][2] = Double.toString(sTmp.getPriceOfProduct());
        data[i][3] = Integer.toString(sTmp.getDiscountRateOfCoupon());

        //Get final price
        double finalPrice = sTmp.getPriceOfProduct() -
                sTmp.getPriceOfProduct()*((double)sTmp.getDiscountRateOfCoupon()/100);
        data[i][4] = new Formatter().format("%.2f", finalPrice).toString();
        data[i][5] = Integer.toString(sTmp.getExpirationPeriod());
        data[i][6] = sTmp.getStatusOfCoupon();
    }
Junrui
  • 15
  • 5
  • If your column contains values of type String, they are alphabetically ordered – Ansharja Nov 12 '17 at 17:51
  • Type is String. – Junrui Nov 12 '17 at 17:51
  • 1
    1) For better help sooner, post a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). 2) As general advice though, don't forget to ask an actual question. – Andrew Thompson Nov 12 '17 at 17:52
  • What is returning getColumnClass for your column index? However, please provide something that we can compile and run, see what a [mcve] is – Ansharja Nov 12 '17 at 17:53
  • @Junrui If Type is string, then make it numeric. See [this question](https://stackoverflow.com/questions/6592192/why-does-my-jtable-sort-an-integer-column-incorrectly). – Ansharja Nov 12 '17 at 17:55
  • 1
    Unless you override it, `DefaultTableModel::getColumnClass` "Returns `Object.class` regardless of `columnIndex`." – trashgod Nov 12 '17 at 18:24
  • 1
    I note the text of the 'question' has been edited since my comment. I also note that there is still no question, and no MCVE / SSCCE. Why is that? I have voted to close this, since there are two reasons for doing so. – Andrew Thompson Nov 13 '17 at 00:03

1 Answers1

0

See my solution below. Now it sorts "Price of product" correctly. Main change is to override getColumnClass() in table model. With this change, "Price of product" values are treated as numbers. Earlier they were treated as strings.

I also changed the type of data array to Object[][]. And set double value to data[i][2] without converting it to String.

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.util.Arrays;
import java.util.Formatter;
import java.util.List;

public class TableSorting
{
  public static void main(String[] args)
  {
    // Columns of table
    String[] columns = {"Name of Coupon Provider", "Name of product", "Price of product",
        "Discount rate of the coupon (%)", "Final price", "Expiration Period", "Status of a coupon"};

    //Data of table
    List<Coupon> couponArray = Arrays.asList(
        new Coupon("aaa", "bbb", 100.2, 1, 1, "a"),
        new Coupon("aaa", "bbb", 60.2, 1, 1, "a"),
        new Coupon("aaa", "bbb", 160.4, 1, 1, "a"),
        new Coupon("aaa", "bbb", 220.2, 1, 1, "a"),
        new Coupon("aaa", "bbb", 70.2, 1, 1, "a"),
        new Coupon("aaa", "bbb", 150.2, 1, 1, "a"),
        new Coupon("aaa", "bbb", 160.3, 1, 1, "a"),
        new Coupon("aaa", "bbb", 210.3, 1, 1, "a"));

    int lengthArray = couponArray.size();
    Object data[][] = new Object[lengthArray][7];
    for (int i = 0; i < lengthArray; i++){
      Coupon sTmp = couponArray.get(i);
      data[i][0] = sTmp.getNameOfCouponProvider();
      data[i][1] = sTmp.getNameOfProduct();
      data[i][2] = sTmp.getPriceOfProduct();//Double.toString(sTmp.getPriceOfProduct());
      data[i][3] = Integer.toString(sTmp.getDiscountRateOfCoupon());

      //Get final price
      double finalPrice = sTmp.getPriceOfProduct() -
          sTmp.getPriceOfProduct()*((double)sTmp.getDiscountRateOfCoupon()/100);
      data[i][4] = new Formatter().format("%.2f", finalPrice).toString();
      data[i][5] = Integer.toString(sTmp.getExpirationPeriod());
      data[i][6] = sTmp.getStatusOfCoupon();
    }

    DefaultTableModel tableModel = new DefaultTableModel(data, columns) {

      @Override
      public boolean isCellEditable(int row, int column) {
        //all cells false
        return false;
      }

      //This makes values in "Price" column treated as numerical values
      // instead of String values.
      @Override
      public Class<?> getColumnClass(int columnIndex)
      {
        if (columnIndex == 2)
        {
          return Double.class;
        }
        return super.getColumnClass(columnIndex);
      }
    };
    JTable table = new JTable();
    table.setModel(tableModel);

    //Sort table
    table.setAutoCreateRowSorter(true);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
  }
}

class Coupon
{
  private String nameOfCouponProvider;
  private String nameOfProduct;
  private double priceOfProduct;
  private int discountRateOfCoupon;
  private int expirationPeriod;
  private String statusOfCoupon;

  Coupon(String nameOfCouponProvider, String nameOfProduct,
         double priceOfProduct, int discountRateOfCoupon,
         int expirationPeriod, String statusOfCoupon)
  {
    this.nameOfCouponProvider = nameOfCouponProvider;
    this.nameOfProduct = nameOfProduct;
    this.priceOfProduct = priceOfProduct;
    this.discountRateOfCoupon = discountRateOfCoupon;
    this.expirationPeriod = expirationPeriod;
    this.statusOfCoupon = statusOfCoupon;
  }

  String getNameOfCouponProvider() { return nameOfCouponProvider; }
  String getNameOfProduct() { return nameOfProduct; }
  double getPriceOfProduct() { return priceOfProduct; }
  int getDiscountRateOfCoupon() { return discountRateOfCoupon; }
  int getExpirationPeriod() { return expirationPeriod; }
  String getStatusOfCoupon() { return statusOfCoupon; }
}
Prasad Karunagoda
  • 2,048
  • 2
  • 12
  • 16