我想创建一个CRUD应用程序,我的问题是我不知道如何为JTable编写DateEditor。

我不知道如何实现DateEditor。格式应为“ dd.mm.yyyy”。

我希望你能帮助我。

我开发并工作了以下东西。

表格模型

    public class SheepTableModel extends AbstractTableModel{
    ArrayList<Sheep> data = new ArrayList();
    private String[] columnNames;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy");

    public SheepTableModel() {

        data.add(new Sheep(1, "Test", new Date(2014, 6, 7), "ADSF", "sdfwe", new Date(2014, 8, 27), 1, new Date(2014, 8, 27), "Testnotiz"));
        data.add(new Sheep(1, "Test", new Date(2014, 6, 7), "ADSF", "sdfwe", new Date(2014, 8, 27), 1, new Date(2014, 8, 27), "Testnotiz"));
        data.add(new Sheep(1, "Test", new Date(2014, 6, 7), "ADSF", "sdfwe", new Date(2014, 8, 27), 1, new Date(2014, 8, 27), "Testnotiz"));

        columnNames = new String[]{"Nummer", "Ohrenmarkennummer", "Geburtsdatum", "Nummer Mutter", "Nummer Vater", "DKV Datum", "Anmerkungsnummer", "Anmerkungsdatum", "Notiz"};
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public int getColumnCount() {
        return 9;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Sheep s = (Sheep) data.get(rowIndex);
        switch(columnIndex){
            case 0: return s.getSheepnumber();
            case 1: return s.getEarnumber();
            case 2: return s.getBirthdate();
            case 3: return s.getNr_mum();
            case 4: return s.getNr_dad();
            case 5: return s.getDkvdate();
            case 6: return s.getNotenr();
            case 7: return s.getNote_date();
            case 8: return s.getNote_addtext();
            default: return null;
        }

    }

    @Override
    public boolean isCellEditable(int row, int col){
        return col != 0;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
            switch(col){
                case 1: data.get(row).setEarnumber(((String) (value))); break;
                case 2: data.get(row).setBirthdate(((Date) (value)));break;
                case 3: data.get(row).setNr_mum(((String) (value)));break;
                case 4: data.get(row).setNr_dad(((String) (value)));break;
                case 5: data.get(row).setDkvdate(((Date) (value)));break;
                case 6: data.get(row).setNotenr(((Integer)(value)));break;
                case 7: data.get(row).setNote_date(((Date)(value)));break;
                case 8: data.get(row).setNote_addtext(((String) (value)));
            }
            fireTableCellUpdated(row, col);
    }

    @Override
    public String getColumnName(int columnIndex){
        return columnNames[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch(columnIndex){
            case 0: return int.class;
            case 1: return String.class;
            case 2: return Date.class;
            case 3: return String.class;
            case 4: return String.class;
            case 5: return Date.class;
            case 6: return int.class;
            case 7: return Date.class;
            case 8: return String.class;
        }
        return Object.class;

    }

}


DateRenderer

    public class DateCellRenderer extends DefaultTableCellRenderer{

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
        super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
        if ( value instanceof Date ){
            // Use SimpleDateFormat class to get a formatted String from Date object.
            String strDate = new SimpleDateFormat("dd.mm.yyyy").format((Date)value);
            // Sorting algorithm will work with model value. So you dont need to worry about the renderer's display value.
            this.setText( strDate );
    }

    return this;
    }
}

最佳答案

您需要做两件事。


创建一个渲染器。查看Table Format Render,以方便地完成此操作。请注意,您不能仅使用"dd.mm.yyyy"作为格式,因为大写/小写表示不同的意思。阅读SimpleDateFormat API以获取要使用的正确格式字符。
您需要创建一个自定义编辑器来编辑日期。我想您应该能够将DefaultCellEditor与使用适当掩码的JFormattedTextField一起使用。阅读Swing教程中关于How to Use Formatted Text Fields的部分,以获取有关JFormattedTextField的更多信息。


基本代码可能类似于:

MaskFormatter format = new MaskFormatter(...);
JFormattedTextField ftf = new JFormattedTextField( format );
DefaultCellEditor dce = new DefaultCellEditor( ftf );
table.getColumnModel().getColumn(...).setCellEditor(dce);


Swing教程的How to Use Tables部分也提供了有关渲染和编辑器的更多信息。

09-30 18:03