 <p>1) please read tutorial about <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting" rel="nofollow noreferrer">JTable that's contains TableRowSorter example</a>, issue about RowSorter must be in your code</p> <p>2) by default you can to use follows definition for ColumnClass, </p> <pre><code>public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } </code></pre> <p>3) or you can to hardcode that </p> <pre><code> @Override public Class&lt;?&gt; getColumnClass(int colNum) { switch (colNum) { case 0: return Integer.class; case 1: return Double.class; case 2: return Long.class; case 3: return Boolean.class; case 4: return String.class; case 5: return Icon.class; default: return String.class; } } </code></pre> <p>4) or override <code>RowSorter</code> (notice crazy code)</p> <p><img src="https://i.stack.imgur.com/Q6S63.png" alt="enter image description here"> <img src="https://i.stack.imgur.com/0wouS.png" alt="enter image description here"></p> <pre><code>import com.sun.java.swing.Painter; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.table.*; public class JTableSortingIconsForNimbus extends JFrame { private static final long serialVersionUID = 1L; private JTable table; private JTable table1; private static Icon ascendingSortIcon; private static Icon descendingSortIcon; public JTableSortingIconsForNimbus() { Object[] columnNames = {"Type", "Company", "Shares", "Price"}; Object[][] data = { {"Buy", "IBM", new Integer(1000), new Double(80.50)}, {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)}, {"Sell", "Apple", new Integer(3000), new Double(7.35)}, {"Buy", "Nortel", new Integer(4000), new Double(20.00)} }; DefaultTableModel model = new DefaultTableModel(data, columnNames) { private static final long serialVersionUID = 1L; @Override public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; table = new JTable(model) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); int firstRow = 0; int lastRow = table.getRowCount() - 1; if (row == lastRow) { ((JComponent) c).setBackground(Color.red); } else if (row == firstRow) { ((JComponent) c).setBackground(Color.blue); } else { ((JComponent) c).setBackground(table.getBackground()); } return c; } }; table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.NORTH); table1 = new JTable(model) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); int firstRow = 0; int lastRow = table1.getRowCount() - 1; if (row == lastRow) { ((JComponent) c).setBackground(Color.red); } else if (row == firstRow) { ((JComponent) c).setBackground(Color.blue); } else { ((JComponent) c).setBackground(table1.getBackground()); } return c; } }; table1.setPreferredScrollableViewportSize(table1.getPreferredSize()); JScrollPane scrollPane1 = new JScrollPane(table1); //UIDefaults nimbusOverrides = new UIDefaults(); //nimbusOverrides.put("Table.ascendingSortIcon", ascendingSortIcon); //nimbusOverrides.put("Table.descendingSortIcon", descendingSortIcon); //table1.putClientProperty("Nimbus.Overrides", nimbusOverrides); //UIManager.getLookAndFeelDefaults().put("Table.ascendingSortIcon", ascendingSortIcon); //UIManager.getLookAndFeelDefaults().put("Table.descendingSortIcon", descendingSortIcon); UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].ascendingSortIconPainter", new FillPainter1(new Color(255, 255, 191))); UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].descendingSortIconPainter", new FillPainter1(new Color(191, 255, 255))); SwingUtilities.updateComponentTreeUI(table1); add(scrollPane1, BorderLayout.SOUTH); TableRowSorter&lt;TableModel&gt; sorter = new TableRowSorter&lt;TableModel&gt;(table.getModel()) { @Override public void toggleSortOrder(int column) { if (column &gt;= 0 &amp;&amp; column &lt; getModelWrapper().getColumnCount() &amp;&amp; isSortable(column)) { List&lt;SortKey&gt; keys = new ArrayList&lt;SortKey&gt;(getSortKeys()); if (!keys.isEmpty()) { SortKey sortKey = keys.get(0); if (sortKey.getColumn() == column &amp;&amp; sortKey.getSortOrder() == SortOrder.DESCENDING) { setSortKeys(null); return; } } } super.toggleSortOrder(column); } }; table.setRowSorter(sorter); table1.setRowSorter(sorter); } static class FillPainter1 implements Painter&lt;JComponent&gt; { private final Color color; public FillPainter1(Color c) { color = c; } @Override public void paint(Graphics2D g, JComponent object, int width, int height) { g.setColor(color); g.fillRect(0, 0, width - 1, height - 1); } } public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); ascendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.ascendingSortIcon"); descendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.descendingSortIcon"); UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].ascendingSortIconPainter", new FillPainter1(new Color(127, 255, 191))); UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].descendingSortIconPainter", new FillPainter1(new Color(191, 255, 127))); } catch (Exception fail) { } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JTableSortingIconsForNimbus frame = new JTableSortingIconsForNimbus(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } </code></pre>