webentwicklung-frage-antwort-db.com.de

Zeigen Sie den Kalender an, um ein Datum in Java auszuwählen

In anderen Sprachen wie VB, C # können Sie in Fällen, in denen der Benutzer ein Datum eingeben soll, beispielsweise in einem Textfeld, einen Kalender erstellen, sobald Sie darauf klicken. Der Benutzer kann also auf das entsprechende Datum klicken und dieses Datum wird in das Textfeld eingefügt.

Auf diese Weise können wir Probleme beseitigen, die durch Datumsangaben in einem falschen Format verursacht werden können. Ich muss wissen, wie wir das in Java erreichen können?

Eigentlich muss ich dies mit einer JTable kombinieren. In einer Spalte muss das Datum eingegeben werden. Benutzer können jedoch Datumsangaben in verschiedenen Formaten eingeben. Also dachte ich daran, so etwas zu machen. Ich hoffe, es gibt einen Weg, dies einfach zu tun.

Kann mir bitte jemand zeigen, wie das geht. Jede Hilfe wird sehr geschätzt ..

Vielen Dank.

8
Anubis

Ich habe JXDatePicker als bessere Lösung dafür gefunden. Es gibt, was Sie brauchen und sehr einfach zu bedienen. 

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);
    }
}
18
user1547921

Ich habe eine DateTextField-Komponente geschrieben.

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();
        }
    }
}
11
Liu guanghua

Die Bibliothek LGoodDatePicker enthält eine (swing) DatePicker - Komponente, mit der der Benutzer Datumsangaben aus einem Kalender auswählen kann. (Standardmäßig können die Benutzer Datumsangaben auch über die Tastatur eingeben. Die Tastatureingabe kann jedoch deaktiviert werden, wenn dies gewünscht wird). Der DatePicker verfügt über eine automatische Datenvalidierung. Dies bedeutet (unter anderem), dass jedes Datum, das der Benutzer eingibt, immer in das gewünschte Datumsformat konvertiert wird. 

Fair Disclosure: Ich bin der Hauptentwickler.

Da der DatePicker eine Swing-Komponente ist, können Sie ihn zu jedem anderen Swing-Container hinzufügen, einschließlich (in Ihrem Szenario) den Zellen einer JTable.

Die am häufigsten verwendeten Datumsformate werden automatisch unterstützt, und auf Wunsch können weitere Datumsformate hinzugefügt werden. 

Um das gewünschte Datumsformat zu erzwingen, möchten Sie höchstwahrscheinlich das gewählte Format als Standardanzeigeformat für den DatePicker festlegen. Formate können mithilfe von Java 8 DateTimeFormatter Patterns angegeben werden. Unabhängig davon, was der Benutzer eingibt (oder klickt), wird das Datum immer in das angegebene Format konvertiert, sobald der Benutzer fertig ist.

Neben dem DatePicker enthält die Bibliothek auch die Komponenten TimePicker und DateTimePicker . Ich habe unten Screenshots aller Komponenten (und des Demoprogramms) eingefügt. 

Die Bibliothek kann aus dem Projekt Release-Seite in Ihr Java-Projekt installiert werden.

Die Homepage des Projekts befindet sich auf Github unter:
https://github.com/LGoodDatePicker/LGoodDatePicker


DateTimePicker screenshot


DateTimePicker examples


Demo screenshot

8
BlakeTNC

Es gibt auch eine andere einfache Methode in Netbeans, Es gibt Bibliotheken in Netbeans selbst, in denen Lösungen für diese Art von Situationen verfügbar sind Link, starten Sie bitte Netbeans neu.

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 :)
4
Amal lal T L
  1. Öffnen Sie Ihr Java-Quellcodedokument und navigieren Sie zu dem JTable-Objekt, das Sie in Ihrer Swing-Klasse erstellt haben.

  2. Erstellen Sie ein neues TableModel-Objekt, das eine DatePickerTable enthält. Sie müssen die DatePickerTable mit einem Bereich von Datumswerten im MMDDYYYY-Format erstellen. Der erste Wert ist das Anfangsdatum und der letzte ist das Enddatum. Im Code sieht das so aus:

    TableModel datePicker = new DatePickerTable("01011999","12302000");
    
  3. Legen Sie das Anzeigeintervall im DatePicker-Objekt fest. Standardmäßig wird jeder Tag angezeigt, Sie können jedoch ein reguläres Intervall einstellen. Verwenden Sie diesen Code, um ein Intervall von 15 Tagen zwischen den Datumsoptionen festzulegen:

    datePicker.interval = 15;
    
  4. Befestigen Sie Ihr Tischmodell in Ihrer JTable:

    JTable newtable = new JTable (datePicker);
    

    Ihre Java-Anwendung verfügt jetzt über ein Dropdown-Datumsauswahldialogfeld. 

0
Sachin Mhetre