如何为JTable列添加JXDatepicker

时间:2012-08-06 04:22:20

标签: java swing datepicker jtable swingx

我正在使用JTable。我有一个Date列,当我点击一个单元格时,我需要在其中显示一个JXDatePicker,以便我可以从中选择一个日期。

有人可以告诉我该怎么做吗?

谢谢!等待答案..

4 个答案:

答案 0 :(得分:10)

您应该使用DatePickerCellEditorCellEditor使用JXDatePicker作为编辑器组件。例如:

TableColumn dateColumn = table.getColumnModel().getColumn(columnIndex);
dateColumn.setCellEditor(new DatePickerCellEditor());

这是一个演示表:

import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;

import org.jdesktop.swingx.table.DatePickerCellEditor;

public class DateColumnDemo {

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("DateColumnDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTable table = new JTable(new Object[][] { { "1", new Date() } },
                new Object[] { "Id", "Time" });

        TableColumn dateColumn = table.getColumnModel().getColumn(1);
        dateColumn.setCellEditor(new DatePickerCellEditor());

        JScrollPane scrollPane = new JScrollPane(table); 

        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

答案 1 :(得分:5)

正如我对Max'正确答案的评论中已经提到的那样:

JXTable(与普通JTable相同)默认使用DateFormat.getInstance()返回的格式格式化日期值。如果格式化似乎不起作用,那通常是tableModel的不完整实现:​​仅当columnClass返回该特定类型时才使用特定类型的默认渲染器

// in your TableModel, implement getColumnClass
@Override
public Class<?> getColumnClass(int columnIndex) {
    if (columnIndex == myDateColumnIndex) {
        return Date.class;
    }
    ...
}

要安装具有自定义格式的日期渲染器,请根据需要使用FormatStringValue实例化DefaultTableRenderer并告诉表使用它(每列,适用于任何columnClass或per-table,适用于返回Date类的列)

StringValue sv = new FormatStringValue(new SimpleDateForma("dd-MMMM-yyyy"));
TableCellRenderer r = new DefaultTableRenderer(sv);
// either per-column
table.getColumn(dateColumnIndex).setCellRenderer(r);
// or per-table
table.setDefaultRenderer(Date.class, r);

答案 2 :(得分:3)

您可以为Date类提供默认表格单元格编辑器(假设该列使用Date

查看setDefaultEditor了解详情。

这往往有点笨拙,因此您可以使用JTable.getColumnModel().getColumn(int).setCellEditor(editor)指定要用于给定TableColumn的编辑器

结帐How to use Tables (Using other Editors)了解详情

答案 3 :(得分:0)

您可以通过向表中添加“表编辑器”将DatePicker添加到JTable(或JXTable)。表编辑器是实现“javax.swing.table.TableCellEditor”接口的任何类。您可以使用above所述的JXDatePicker组件或此处所示的LGoodDatePicker库来执行此操作。 (这是针对同一问题的替代解决方案。)

公平披露:我是LGoodDatePicker的主要开发人员。

LGoodDatePicker库包含三个 TableEditor 类。这些类允许程序员将DatePicker,TimePicker或DateTimePicker添加到Swing JTable(或SwingX JXTable)的单元格中。

拾取器类也可以添加到普通的秋千面板或其他摆动容器中。

以下是如何将DateTimePicker添加到JTable的示例:

// Create a table.
JTable table = new JTable(new DemoTableModel());

// Add the DateTimeTableEditor as the default editor and renderer for
// the LocalDateTime data type.
table.setDefaultEditor(LocalDateTime.class, new DateTimeTableEditor());
table.setDefaultRenderer(LocalDateTime.class, new DateTimeTableEditor());

// Explicitly set the default editor and renderer for column index 0.
TableColumn column = table.getColumnModel().getColumn(0);
column.setCellEditor(table.getDefaultEditor(LocalDateTime.class));
column.setCellRenderer(table.getDefaultRenderer(LocalDateTime.class));

以下是关于How to use table editors的Oracle教程。

我已经在表编辑器演示,选择器组件和完整演示下面粘贴了截图。请注意,LGoodDatePicker库包含表编辑器的单独演示。它位于此文件夹下的Repository:“LGoodDatePicker / Project / src / main / java / com / github / lgooddatepicker / demo / TableEditorsDemo.java”。

可以从项目Release Page将库安装到Java项目中。

项目主页位于Github上:
https://github.com/LGoodDatePicker/LGoodDatePicker

Table Editors Demo screenshot

Date and TimePicker screenshots

Full Demo screenshot