problem formatting fields in a JTable - differences between Integer and Double

前端 未结 4 1674
清酒与你
清酒与你 2020-11-30 15:05

Update

Confirmed as a bug on JTable can\'t format given Object as Number when columnClass is Double (bug ID: 7051636). Feel free to vote for it, or if if you have

4条回答
  •  不知归路
    2020-11-30 15:45

    reall problem is noting to do with previous debate, there is plain vanilla (compare my missing English skills), are you think that that's really Bug, or if I showed ViceVersaView, maybe then somone can be able to comment that chains for JTable + TableModel + Comparator (TableRowSorter for JTable API) in English language, eeeeeerghhh really my bad in this case

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Date;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class ViceVersaBugFromTableModelAndComparator {
    
        private String[] columnNames = {"String", "Integer", "Boolean", "Double", "Date"};
        private Object[][] data = {
            {"aaa", 12, true, .15, new Date()},
            {"bbb", 5, false, 100.01, new Date()},
            {"CCC", 92, true, 15.2, new Date()},
            {"DDD", 0, false, 10.80, new Date()},
            {"abc", 5, true, 4.11, new Date()},
            {"bae", 31, false, 100.01, new Date()},
            {"CAX", 27, true, 2.3, new Date()},
            {"AXD", 4, false, 50.00, new Date()},
            {"abc", 3, true, 1.5, new Date()},
            {"bae", 5, false, 1000, new Date()}, //java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
            //{"bae", 5, false, 1000.0, new Date()}, //un-comment for correctness
            {"CAX", 2, true, 21.7, new Date()},
            {"AXD", 2, false, 5.30, new Date()}
        };
        private TableModel model = new DefaultTableModel(data, columnNames) {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public Class getColumnClass(int column) {
                return String.class;// again java.lang.ClassCastException 
                //return getValueAt(0, column).getClass(); //un-comment for correctness
            }
        };
        private JTable table = new JTable(model);
        private JTableHeader header;
    
        static class TestTableRowSorter extends TableRowSorter {
    
            public TestTableRowSorter(TableModel m) {
                super(m);
            }
    
            @Override
            public void toggleSortOrder(int column) {
            }
    
            public void wrapToggleSortOrder(int column) {
                super.toggleSortOrder(column);
            }
        }
        private Timer timer = new Timer(400, new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("single");
                JTable table = header.getTable();
                RowSorter sorter;
                if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
                    int columnIndex = header.columnAtPoint(pt);
                    if (columnIndex != -1) {
                        columnIndex = table.convertColumnIndexToModel(columnIndex);
                        ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
                    }
                }
            }
        });
        private Point pt;
    
        public JComponent makeUI() {
            timer.setRepeats(false);
            table.setRowSorter(new TestTableRowSorter(model));
            header = table.getTableHeader();
            header.addMouseListener(new MouseAdapter() {
    
                @Override
                public void mouseClicked(final MouseEvent e) {
                    if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
                        System.out.println("double");
                        pt = null;
                        timer.stop();
                    } else {
                        pt = e.getPoint();
                        timer.restart();
                    }
                }
            });
            JPanel p = new JPanel(new BorderLayout());
            p.add(new JScrollPane(table));
            return p;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        public static void createAndShowGUI() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            f.getContentPane().add(new ViceVersaBugFromTableModelAndComparator().makeUI());
            f.setSize(820, 240);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }
    

提交回复
热议问题