【问题标题】:Setting a Minimum Date for JXDatePicker in a JTable column在 JTable 列中设置 JXDatePicker 的最小日期
【发布时间】:2014-11-24 06:09:28
【问题描述】:

如何在我的 JTable 列中为 JXDatePicker 设置最小日期。也就是说,我只需要在 JXDatePicker 中显示/启用大于当前日期的日期,应在日历中禁用低于当前日期的日期,以便用户无法选择那些日期。怎么做?请帮助我。下面是我的代码。

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 TableWithDate {

private static void createAndShowGUI() {
    JFrame frame = new JFrame("TableWithDate");
    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();
        }
    });
}
}

【问题讨论】:

  • JXDatePicker 字段具有 protected 访问权限,您必须扩展 DatePickerCellEditor 并提供该功能...
  • 我该怎么做...请给我一个例子

标签: java swing jtable swingx


【解决方案1】:

JXDatePicker 字段具有 protected 访问权限,您必须扩展 DatePickerCellEditor 并提供该功能...

public class BoundDatePickerCellEditor extends DatePickerCellEditor {

    public BoundDatePickerCellEditor() {
        super();
    }

    public BoundDatePickerCellEditor(DateFormat dateFormat) {
        super(dateFormat);
    }

    public void setLowerBound(Date date) {
        datePicker.getMonthView().setLowerBound(date);          
    }

    public void setUpperBound(Date date) {
        datePicker.getMonthView().setLowerBound(date);          
    }

}

可运行示例...

import java.awt.EventQueue;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.TableColumn;
import org.jdesktop.swingx.table.DatePickerCellEditor;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
                JTable table = new JTable(new Object[][]{{"1", new Date()}},
                                new Object[]{"Id", "Time"});

                TableColumn dateColumn = table.getColumnModel().getColumn(1);
                BoundDatePickerCellEditor picker = new BoundDatePickerCellEditor();
                picker.setLowerBound(new Date());
                dateColumn.setCellEditor(picker);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BoundDatePickerCellEditor extends DatePickerCellEditor {

        public BoundDatePickerCellEditor() {
            super();
        }

        public BoundDatePickerCellEditor(DateFormat dateFormat) {
            super(dateFormat);
        }

        public void setLowerBound(Date date) {
            datePicker.getMonthView().setLowerBound(date);
        }

        public void setUpperBound(Date date) {
            datePicker.getMonthView().setLowerBound(date);
        }

    }
}

如果您今天也想排除,您可以使用类似...

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
picker.setLowerBound(cal.getTime());

...例如

【讨论】:

  • 我怎样才能访问这个课程??
  • 就像你做任何课程一样,dateColumn.setCellEditor(new BoundDatePickerCellEditor()); - 在你掌握了这些基本概念之前,你可能需要重新考虑编写 UI,因为这几乎是你在 GUI 中的生计
  • 如果我在我的类 TableWithDate 中定义这个类,它会显示一些错误,因此我在我的类之外创建了一个这个类,它不会禁用小于当前日期的日期
  • 这可能是因为您的createAndShowGUIstatic 并且您将内部类定义为不是static,我个人会将其设为外部类。 “并且它不会禁用小于当前日期的日期” - 这可能是因为您没有告诉它,您需要相应地设置lowerBound属性...
  • 哦,是的,这就是静态类问题的 bcs。这就是为什么我问你如何访问你的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2018-05-22
  • 2012-04-25
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多