如何为 JTable 列添加 JXDatepicker

Posted

技术标签:

【中文标题】如何为 JTable 列添加 JXDatepicker【英文标题】:How to Add a JXDatepicker for a JTable column 【发布时间】:2012-08-03 02:01:30 【问题描述】:

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

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

谢谢!等待答案..

【问题讨论】:

【参考方案1】:

您可能应该使用DatePickerCellEditor,这是一个使用JXDatePicker 作为编辑器组件的CellEditor。例如:

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();
            
        );
    

【讨论】:

是的,我明白了,谢谢! (不过,现在我还有几个新问题。) 对于这种情况,您建议使用哪个表,JTable 还是 JXTable?我希望添加一些用户友好的功能。我的桌子大约有 25 列。行数没有限制......非常感谢任何建议......@Max @Anubis,根据您要添加的功能,我可能会建议使用 JXTable,因为它具有非常好的突出显示 API,除此之外,恕我直言 @MadProgrammer,我正在关注 Max 的回答。我在那里遇到了一个小问题。选择器工作正常。但无法弄清楚如何更改其格式。我需要“dd-MMM-yyyy”格式,但它显示类似“Wed Aug 01 00:00:00 IST 2012”。我已经更改了 DatePickerCellEditors 格式,是的,它做了一些事情,它仅在我单击单元格时根据设置的格式显示。单元格失去焦点后,单元格显示大容量值。任何帮助.. @Anubis 你需要提供一个 CellRenderer 能够按照你想要的方式格式化 Date 值。看看“使用自定义渲染器”docs.oracle.com/javase/tutorial/uiswing/components/…。您对editors 使用相同的基本方法来应用renderers(只需改用renderer 方法)【参考方案2】:

正如我在对 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 或每表,适用于返回 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);

【讨论】:

非常感谢@kleopatra 的详细解释。从来不知道public Class&lt;?&gt; getColumnClass(int columnIndex)... 方法的用途。你的回答变得非常有用..【参考方案3】:

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

查看setDefaultEditor了解详情。

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

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

【讨论】:

谢谢@MadProgrammer,你以前帮助过我。我想我选择的答案是好的。不是吗? @Anubis 当然,Max 的答案得到了很好的扩展并且有例子(我什至给了它一个 +1 ;))【参考方案4】:

您可以通过将“表编辑器”添加到表中来将 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。

【讨论】:

以上是关于如何为 JTable 列添加 JXDatepicker的主要内容,如果未能解决你的问题,请参考以下文章

在JTable列中设置右对齐

如何为 JTable 中的单元格着色? [复制]

Scala Spark,如何为列添加值

PySpark:如何为数组列中的每个元素添加值?

单击 JButton 时不会填充 JTable

Power Query:如何为列表中的每一行添加列