【问题标题】:Display calendar to pick a date in java在java中显示日历以选择日期
【发布时间】:2012-07-29 00:41:26
【问题描述】:

在VB、C#等其他语言中,在您希望用户输入日期的情况下,例如在文本框中,我们可以制作一个日历,一旦您点击它就会出现。这样用户可以点击相应的日期,该日期将被放入文本框中。

通过这种方式,我们可以摆脱由于日期格式不正确而导致的问题。我需要知道我们如何在 java 中实现这一点?

实际上,我需要将它与 JTable 结合起来。有一列需要输入日期。但用户可以输入各种格式的日期。所以我想去这样的事情。希望有一种方法可以轻松地做到这一点。

谁能告诉我如何做到这一点。非常感谢任何帮助..

谢谢。

【问题讨论】:

  • 我不知道 jTable 是什么,但是你正在寻找的是一个日期选择器,如果你用谷歌搜索 jTable 日期选择器,你会得到几个可能是你正在寻找的结果。您可能会在这里找到一些其他有用的问题stackoverflow.com/search?q=jTable+Date+Picker
  • 你应该指出你正在使用的可视化组件框架,因为 Java 有很多(每个环境有几个)。在桌面中,您可以使用:AWT、Swing、SWT 示例。
  • @helios 对不起,我不明白你的意思,“可视化组件框架”。我需要在 swing.jtable 中使用它。这会回答你的问题吗?
  • @Anubis:我的意思是,您用于可视化组件的技术(例如:JTextbox、JFrame 等都是来自 Swing 框架的类)。当您制作桌面应用程序时,您使用其中一个框架(您使用 Swing 或 SWT,但不混合使用)。因此,解决方案会根据您使用的类组而有所不同。
  • @Anubis:link..我认为这个链接对你很有帮助。:)

标签: java swing date calendar jtable


【解决方案1】:

Netbeans 中的另一种简单方法也可以在这里使用, Netbeans 内部有库,可以提供此类情况的解决方案。选择相关的也可以。这更容易。完成链接中规定的步骤后,请重新启动 Netbeans。

Step1:- Select Tools->Palette->Swing/AWT Components
Step2:- Click 'Add from JAR'in Palette Manager
Step3:- Browse to [NETBEANS HOME]\ide\modules\ext and select swingx-0.9.5.jar
Step4:- This will bring up a list of all the components available for the palette.  Lots of goodies here!  Select JXDatePicker.
Step5:- Select Swing Controls & click finish
Step6:- Restart NetBeans IDE and see the magic :)

【讨论】:

  • 仅链接的答案在 Stack Overflow 上不是最优的(链接失效和其他原因)。请写出链接文章的摘要,最好附上关键源代码和解释。
【解决方案2】:
  1. 打开您的 Java 源代码文档并导航到您在 Swing 类中创建的 JTable 对象。

  2. 创建一个包含 DatePickerTable 的新 TableModel 对象。您必须使用 MMDDYYYY 格式的日期值范围创建 DatePickerTable。第一个值是开始日期,最后一个值是结束日期。在代码中,这看起来像:

    TableModel datePicker = new DatePickerTable("01011999","12302000");
    
  3. 在 datePicker 对象中设置显示间隔。默认情况下显示每一天,但您可以设置一个固定的时间间隔。要在日期选项之间设置 15 天的间隔,请使用以下代码:

    datePicker.interval = 15;
    
  4. 将您的表格模型附加到您的 JTable 中:

    JTable newtable = new JTable (datePicker);
    

    您的 Java 应用程序现在有一个下拉日期选择对话框。

【讨论】:

  • 谢谢@Sachin Mhetre。但是你的建议不起作用。没有像 DatePickerTable 这样的类(Netbeans 下划线)。那是一种插件吗??
【解决方案3】:

我发现JXDatePicker 是一个更好的解决方案。它提供了您需要的东西并且非常易于使用。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jdesktop.swingx.JXDatePicker;

public class DatePickerExample extends JPanel {

    public static void main(String[] args) {
        JFrame frame = new JFrame("JXPicker Example");
        JPanel panel = new JPanel();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(400, 400, 250, 100);

        JXDatePicker picker = new JXDatePicker();
        picker.setDate(Calendar.getInstance().getTime());
        picker.setFormats(new SimpleDateFormat("dd.MM.yyyy"));

        panel.add(picker);
        frame.getContentPane().add(panel);

        frame.setVisible(true);
    }
}

【讨论】:

  • maven 依赖,如果有人在看:<dependency> <groupId>org.swinglabs</groupId> <artifactId>swingx</artifactId> <version>1.6.1</version> </dependency>
【解决方案4】:

LGoodDatePicker 库包含一个 (swing) DatePicker 组件,它允许用户从日历中选择日期。 (默认情况下,用户也可以从键盘输入日期,但如果需要,可以禁用键盘输入)。 DatePicker 具有自动数据验证功能,这意味着(除其他外)用户输入的任何日期都将始终转换为您想要的日期格式。

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

由于 DatePicker 是一个摇摆组件,您可以将它添加到任何其他摇摆容器中,包括(在您的场景中)JTable 的单元格。

自动支持最常用的日期格式,如果需要,可以添加其他日期格式。

要强制执行所需的日期格式,您很可能希望将所选格式设置为 DatePicker 的默认“显示格式”。可以使用 Java 8 DateTimeFormatter Patterns 指定格式。无论用户输入(或点击)什么,只要用户完成,日期总是会立即转换为指定的格式。

除了 DatePicker,该库还有 TimePicker 和 DateTimePicker 组件。 我在下面粘贴了所有组件(和演示程序)的屏幕截图。

该库可以从项目release page 安装到您的Java 项目中。

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




【讨论】:

    【解决方案5】:

    我写了一个 DateTextField 组件。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Frame;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JTextField;
    import javax.swing.SpinnerNumberModel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.border.LineBorder;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class DateTextField extends JTextField {
    
        private static String DEFAULT_DATE_FORMAT = "MM/dd/yyyy";
        private static final int DIALOG_WIDTH = 200;
        private static final int DIALOG_HEIGHT = 200;
    
        private SimpleDateFormat dateFormat;
        private DatePanel datePanel = null;
        private JDialog dateDialog = null;
    
        public DateTextField() {
            this(new Date());
        }
    
        public DateTextField(String dateFormatPattern, Date date) {
            this(date);
            DEFAULT_DATE_FORMAT = dateFormatPattern;
        }
    
        public DateTextField(Date date) {
            setDate(date);
            setEditable(false);
            setCursor(new Cursor(Cursor.HAND_CURSOR));
            addListeners();
        }
    
        private void addListeners() {
            addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent paramMouseEvent) {
                    if (datePanel == null) {
                        datePanel = new DatePanel();
                    }
                    Point point = getLocationOnScreen();
                    point.y = point.y + 30;
                    showDateDialog(datePanel, point);
                }
            });
        }
    
        private void showDateDialog(DatePanel dateChooser, Point position) {
            Frame owner = (Frame) SwingUtilities
                    .getWindowAncestor(DateTextField.this);
            if (dateDialog == null || dateDialog.getOwner() != owner) {
                dateDialog = createDateDialog(owner, dateChooser);
            }
            dateDialog.setLocation(getAppropriateLocation(owner, position));
            dateDialog.setVisible(true);
        }
    
        private JDialog createDateDialog(Frame owner, JPanel contentPanel) {
            JDialog dialog = new JDialog(owner, "Date Selected", true);
            dialog.setUndecorated(true);
            dialog.getContentPane().add(contentPanel, BorderLayout.CENTER);
            dialog.pack();
            dialog.setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
            return dialog;
        }
    
        private Point getAppropriateLocation(Frame owner, Point position) {
            Point result = new Point(position);
            Point p = owner.getLocation();
            int offsetX = (position.x + DIALOG_WIDTH) - (p.x + owner.getWidth());
            int offsetY = (position.y + DIALOG_HEIGHT) - (p.y + owner.getHeight());
    
            if (offsetX > 0) {
                result.x -= offsetX;
            }
    
            if (offsetY > 0) {
                result.y -= offsetY;
            }
    
            return result;
        }
    
        private SimpleDateFormat getDefaultDateFormat() {
            if (dateFormat == null) {
                dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
            }
            return dateFormat;
        }
    
        public void setText(Date date) {
            setDate(date);
        }
    
        public void setDate(Date date) {
            super.setText(getDefaultDateFormat().format(date));
        }
    
        public Date getDate() {
            try {
                return getDefaultDateFormat().parse(getText());
            } catch (ParseException e) {
                return new Date();
            }
        }
    
        private class DatePanel extends JPanel implements ChangeListener {
            int startYear = 1980;
            int lastYear = 2050;
    
            Color backGroundColor = Color.gray;
            Color palletTableColor = Color.white;
            Color todayBackColor = Color.orange;
            Color weekFontColor = Color.blue;
            Color dateFontColor = Color.black;
            Color weekendFontColor = Color.red;
    
            Color controlLineColor = Color.pink;
            Color controlTextColor = Color.white;
    
            JSpinner yearSpin;
            JSpinner monthSpin;
            JButton[][] daysButton = new JButton[6][7];
    
            DatePanel() {
                setLayout(new BorderLayout());
                setBorder(new LineBorder(backGroundColor, 2));
                setBackground(backGroundColor);
    
                JPanel topYearAndMonth = createYearAndMonthPanal();
                add(topYearAndMonth, BorderLayout.NORTH);
                JPanel centerWeekAndDay = createWeekAndDayPanal();
                add(centerWeekAndDay, BorderLayout.CENTER);
    
                reflushWeekAndDay();
            }
    
            private JPanel createYearAndMonthPanal() {
                Calendar cal = getCalendar();
                int currentYear = cal.get(Calendar.YEAR);
                int currentMonth = cal.get(Calendar.MONTH) + 1;
    
                JPanel panel = new JPanel();
                panel.setLayout(new FlowLayout());
                panel.setBackground(controlLineColor);
    
                yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,
                        startYear, lastYear, 1));
                yearSpin.setPreferredSize(new Dimension(56, 20));
                yearSpin.setName("Year");
                yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
                yearSpin.addChangeListener(this);
                panel.add(yearSpin);
    
                JLabel yearLabel = new JLabel("Year");
                yearLabel.setForeground(controlTextColor);
                panel.add(yearLabel);
    
                monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1,
                        12, 1));
                monthSpin.setPreferredSize(new Dimension(35, 20));
                monthSpin.setName("Month");
                monthSpin.addChangeListener(this);
                panel.add(monthSpin);
    
                JLabel monthLabel = new JLabel("Month");
                monthLabel.setForeground(controlTextColor);
                panel.add(monthLabel);
    
                return panel;
            }
    
            private JPanel createWeekAndDayPanal() {
                String colname[] = { "S", "M", "T", "W", "T", "F", "S" };
                JPanel panel = new JPanel();
                panel.setFont(new Font("Arial", Font.PLAIN, 10));
                panel.setLayout(new GridLayout(7, 7));
                panel.setBackground(Color.white);
    
                for (int i = 0; i < 7; i++) {
                    JLabel cell = new JLabel(colname[i]);
                    cell.setHorizontalAlignment(JLabel.RIGHT);
                    if (i == 0 || i == 6) {
                        cell.setForeground(weekendFontColor);
                    } else {
                        cell.setForeground(weekFontColor);
                    }
                    panel.add(cell);
                }
    
                int actionCommandId = 0;
                for (int i = 0; i < 6; i++)
                    for (int j = 0; j < 7; j++) {
                        JButton numBtn = new JButton();
                        numBtn.setBorder(null);
                        numBtn.setHorizontalAlignment(SwingConstants.RIGHT);
                        numBtn.setActionCommand(String
                                .valueOf(actionCommandId));
                        numBtn.setBackground(palletTableColor);
                        numBtn.setForeground(dateFontColor);
                        numBtn.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent event) {
                                JButton source = (JButton) event.getSource();
                                if (source.getText().length() == 0) {
                                    return;
                                }
                                dayColorUpdate(true);
                                source.setForeground(todayBackColor);
                                int newDay = Integer.parseInt(source.getText());
                                Calendar cal = getCalendar();
                                cal.set(Calendar.DAY_OF_MONTH, newDay);
                                setDate(cal.getTime());
    
                                dateDialog.setVisible(false);
                            }
                        });
    
                        if (j == 0 || j == 6)
                            numBtn.setForeground(weekendFontColor);
                        else
                            numBtn.setForeground(dateFontColor);
                        daysButton[i][j] = numBtn;
                        panel.add(numBtn);
                        actionCommandId++;
                    }
    
                return panel;
            }
    
            private Calendar getCalendar() {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(getDate());
                return calendar;
            }
    
            private int getSelectedYear() {
                return ((Integer) yearSpin.getValue()).intValue();
            }
    
            private int getSelectedMonth() {
                return ((Integer) monthSpin.getValue()).intValue();
            }
    
            private void dayColorUpdate(boolean isOldDay) {
                Calendar cal = getCalendar();
                int day = cal.get(Calendar.DAY_OF_MONTH);
                cal.set(Calendar.DAY_OF_MONTH, 1);
                int actionCommandId = day - 2 + cal.get(Calendar.DAY_OF_WEEK);
                int i = actionCommandId / 7;
                int j = actionCommandId % 7;
                if (isOldDay) {
                    daysButton[i][j].setForeground(dateFontColor);
                } else {
                    daysButton[i][j].setForeground(todayBackColor);
                }
            }
    
            private void reflushWeekAndDay() {
                Calendar cal = getCalendar();
                cal.set(Calendar.DAY_OF_MONTH, 1);
                int maxDayNo = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
                int dayNo = 2 - cal.get(Calendar.DAY_OF_WEEK);
                for (int i = 0; i < 6; i++) {
                    for (int j = 0; j < 7; j++) {
                        String s = "";
                        if (dayNo >= 1 && dayNo <= maxDayNo) {
                            s = String.valueOf(dayNo);
                        }
                        daysButton[i][j].setText(s);
                        dayNo++;
                    }
                }
                dayColorUpdate(false);
            }
    
            public void stateChanged(ChangeEvent e) {
                dayColorUpdate(true);
    
                JSpinner source = (JSpinner) e.getSource();
                Calendar cal = getCalendar();
                if (source.getName().equals("Year")) {
                    cal.set(Calendar.YEAR, getSelectedYear());
                } else {
                    cal.set(Calendar.MONTH, getSelectedMonth() - 1);
                }
                setDate(cal.getTime());
                reflushWeekAndDay();
            }
        }
    }
    

    【讨论】:

    • 感谢您的代码。它工作正常。但是我请您在下面尝试我接受的解决方案。它工作得很好。我倾向于接受它作为答案,因为它将帮助其他将在未来搜索此问题的人。如果我能接受两个答案,那我当然也会接受你的,不能接受两个答案。希望你不会介意。感谢您的帮助..
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多