【问题标题】:Codename One Sort Table with Data from SQL Database带有 SQL 数据库数据的代号一个排序表
【发布时间】:2017-08-03 23:20:40
【问题描述】:

我正在开发一个从数据库中检索数据的应用程序。我使用的结构来自这里给出的代码示例:https://www.codenameone.com/javadoc/com/codename1/db/Database.html

我的表格可以很好地显示数据。

现在我想对第一列中的表数据进行排序,其中包含日期作为字符串。

实现这一目标的最佳方法是什么?我尝试过使用 JTable 中的代码,但没有成功...

值得承认这是我的第一个 Codename One 应用程序,并且我的 Java 经验恢复不到一年。

【问题讨论】:

    标签: database datatable codenameone


    【解决方案1】:

    您可以采取两个方向,第一个是更改 SQL 并使用 ORDER BY 子句检索正确排序的数据。第二种方法应该动态地与任何表一起工作:

    对于动态可排序表,您需要做更多的工作。我改编了 JavaDoc 中的现有表示例以支持排序。目前我只是为字符串列做了这个,但你可以很容易地替换比较器来做你想做的事......

    Form hi = new Form("Table", new BorderLayout());
    TableModel model = new DefaultTableModel(new String[] {"Col 1", "Col 2", "Col 3"}, new Object[][] {
        {"Row 1", "Row A", "Row X"},
        {"Row 2", "Row B", "Row Y"},
        {"Row 3", "Row C", "Row Z"},
        {"Row 4", "Row D", "Row K"},
        }) {
            public boolean isCellEditable(int row, int col) {
                return col != 0;
            }
        };
    Table table = new Table(model) {
        private int currentSortedColum = -1;
        private boolean asc;
        private Button lastSortedColumnButton;
    
        private void setArrow(int column, Button b) {
            if(column == currentSortedColum) {
                if(asc) {
                    FontImage.setMaterialIcon(b, FontImage.MATERIAL_ARROW_UPWARD);
                } else {
                    FontImage.setMaterialIcon(b, FontImage.MATERIAL_ARROW_DOWNWARD);                            
                }
            } else {
                FontImage.setMaterialIcon(b, FontImage.MATERIAL_SORT);   
            }
        }
    
        @Override
        protected Component createCell(Object value, int row, int column, boolean editable) { // (1)
            Component cell;
            if(row == -1) { 
                // table header 
                cell = new Button("" + value, "TableHeader");
                setArrow(column, ((Button)cell));
                ((Button)cell).setTextPosition(LEFT);
                ((Button)cell).addActionListener(e -> {
                    if(currentSortedColum != column && lastSortedColumnButton != null) {
                        FontImage.setMaterialIcon(lastSortedColumnButton, FontImage.MATERIAL_SORT);   
                    }
                    lastSortedColumnButton = (Button)cell;
                    if(column == currentSortedColum) {
                        asc = !asc;
                    } else {
                        currentSortedColum = column;
                        asc = false;
                    }
                    setArrow(column, lastSortedColumnButton);
                    setModel(new SortedTableModel(currentSortedColum, asc, model, new CaseInsensitiveOrder()));
                });
            } else {
                cell = super.createCell(value, row, column, editable);
            }
            if(row > -1 && row % 2 == 0) { 
                // pinstripe effect 
                cell.getAllStyles().setBgColor(0xeeeeee);
                cell.getAllStyles().setBgTransparency(255);
            }
            return cell;
        }
    };
    hi.add(BorderLayout.CENTER, table);
    hi.show();
    

    为此,您需要排序模型:

    class SortedTableModel implements TableModel {
        private TableModel model;
        private int[] sorted;
    
        public SortedTableModel(int column, boolean asc, TableModel model, Comparator cmp) {
            this.model = model;
    
            sorted = new int[model.getRowCount()];
            Integer[] sortedTemp = new Integer[sorted.length]; 
    
            for(int iter = 0 ; iter < sorted.length ; iter++) {
                sortedTemp[iter] = iter;
            }
    
            // sort(int[]) doesn't accept a comparator how stupid is that...
            Arrays.sort(sortedTemp, (Object o1, Object o2) -> {
                    int i1 = (Integer)o1;
                    int i2 = (Integer)o2;
                    if(asc) {
                        return cmp.compare(model.getValueAt(i1, column), model.getValueAt(i2, column)) * -1;
                    }
                    return cmp.compare(model.getValueAt(i1, column), model.getValueAt(i2, column));
                }
            );
            for(int iter = 0 ; iter < sorted.length ; iter++) {
                sorted[iter] = sortedTemp[iter];
            }
        }
    
        @Override
        public int getRowCount() {
            return model.getRowCount();
        }
    
        @Override
        public int getColumnCount() {
            return model.getColumnCount();
        }
    
        @Override
        public String getColumnName(int i) {
            return model.getColumnName(i);
        }
    
        @Override
        public boolean isCellEditable(int row, int column) {
            return model.isCellEditable(sorted[row], column);
        }
    
        @Override
        public Object getValueAt(int row, int column) {
            return model.getValueAt(sorted[row], column);
        }
    
        @Override
        public void setValueAt(int row, int column, Object o) {
            model.setValueAt(sorted[row], column, o);
        }
    
        @Override
        public void addDataChangeListener(DataChangedListener d) {
            model.addDataChangeListener(d);
        }
    
        @Override
        public void removeDataChangeListener(DataChangedListener d) {
            model.removeDataChangeListener(d);
        }
    }
    

    它产生这个:

    【讨论】:

      【解决方案2】:

      总结了所有有价值的信息,我提出了以下解决方案,我发现它更简单一点:

      1. 从 DatePicker 获取日期作为 Long 值并添加到数据库:

        Long long_Date = gui_date_Picker.getDate().getTime();
        
      2. 从数据库中取出字符串数字,转换成long,转换成日期并放入表中:

        DefaultTableModel model = new DefaultTableModel(new String[]{"Date", "Termin"}, new Object[][] {{}} );
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        
        Database db = null;
        Cursor cur = null;
        
        db = Display.getInstance().openOrCreate("MyDB2.db");
        db.execute("CREATE TABLE IF NOT EXISTS Termine (Date NOT NULL,Event NOT NULL)");
        cur = db.executeQuery("select * from Termine ORDER BY Date ASC; ");
        
        while (cur.next()) {
        
            Row currentRow = cur.getRow();
            String date = currentRow.getString(0);
            String termin = currentRow.getString(1);
        
            Long l = Long.parseLong(date, 10);
            Date date_from_String = new Date(l);
        
            String string_from_Date = formatter.format(date_from_String);
            System.out.println(string_from_Date);
        
        
            model.addRow(new Object[]{string_from_Date, termin });
        }
        
        
        Table table = new Table(model);
        

      【讨论】:

        猜你喜欢
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多