0

我想创建一个 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;

    }

}

日期渲染器

    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;
    }
}
4

1 回答 1

3

你需要做两件事。

  1. 创建渲染器。查看表格格式渲染以获得简单的方法来执行此操作。请注意,您不能只"dd.mm.yyyy"用于格式,因为大写/小写字符表示不同的东西。阅读SimpleDateFormatAPI 以了解要使用的正确格式字符。

  2. 您需要创建一个自定义编辑器来编辑日期。我猜你应该能够使用DefaultCellEditor带有JFormattedTextField适当掩码的 a 。阅读 Swing 教程中有关如何使用格式化文本字段的部分,以获取有关 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提供有关渲染和编辑器的更多信息。

于 2014-10-02T19:18:42.893 回答