如何为JTable列添加JXDatepicker

Sum*_*udu 4 java swing jtable datepicker swingx

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

有人能告诉我怎么做吗?

谢谢!等待一个答复..

ten*_*ica 10

你可能应该使用DatePickerCellEditor,这是一个CellEditor使用JXDatePickeras编辑器组件.例如:

TableColumn dateColumn = table.getColumnModel().getColumn(columnIndex);
dateColumn.setCellEditor(new DatePickerCellEditor());
Run Code Online (Sandbox Code Playgroud)

这是一个演示表:

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Anubis,根据你要添加的功能,我可能会推荐JXTable,因为它有一个非常好的突出显示API,其中包括,恕我直言 (4认同)
  • @MadProgrammer,我正在听Max的回答.我在那里遇到了一个小问题.选择工作正常.但无法弄清楚如何改变其格式.我需要'"dd-MMM-yyyy"'格式,但它显示的内容类似于'Wed Aug 01 00:00:00 IST 2012'.我已经更改了DatePickerCellEditors格式,是的,它做了一些事情,它只在我点击单元格时才按照设置格式显示.细胞松散焦点后,细胞显示出笨重的价值.任何帮助.. (3认同)
  • 对于这种用途你建议使用哪个表,JTable或JXTable?我希望添加一些用户友好的功能.我的桌子上有大约25列.对行数没有限制......非常感谢任何建议.. @Max (2认同)

kle*_*tra 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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

要安装具有自定义格式的日期渲染器,请根据需要使用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);
Run Code Online (Sandbox Code Playgroud)