Java календарь выбором даты

Показать календарь, чтобы выбрать дату в Java

В других языках, таких как VB, С#, в тех случаях, когда вы хотите, чтобы пользователь вводил дату, скажем, в текстовом поле, мы можем сделать календарь появляться после нажатия на него. Таким образом, пользователь может нажать на соответствующую дату, и эта дата будет помещена в текстовое поле. Таким образом, мы можем избавиться от проблем, которые могут быть вызваны из-за дат в неправильном формате. Мне нужно знать, как мы можем достичь этого в java? Собственно, мне нужно объединить это с JTable. есть столбец, в который должна быть введена дата. Но пользователи могут вводить даты в различных форматах. Поэтому я подумал о том, чтобы пойти в нечто подобное. Надеюсь, что есть способ сделать это, легко. Кто-нибудь, пожалуйста, покажет мне, как это сделать. Любая помощь приветствуется. Спасибо.

Я понятия не имею, что такое jTable, однако то, что вы ищете, называется «Выбор даты», и если вы выбираете дату в Google jTable, вы получите несколько результатов, которые могут быть именно теми, что вы ищете. Вы можете найти некоторые другие полезные вопросы здесь stackoverflow.com/search?q=jTable+Date+Picker

Вы должны указать, какую платформу визуальных компонентов вы используете, потому что в Java их достаточно (по несколько для каждой среды). В десктопе вы можете использовать: AWT, Swing, SWT на примере.

@helios Извините, я не совсем понимаю, что вы имеете в виду, «фреймворк для визуальных компонентов». Мне нужно использовать это в swing.jtable. Это ответит на ваш вопрос?

@hectorg87 hectorg87, спасибо. Я не знал, как искать, «выбор даты» вещь. Спасибо за это. Я попытаюсь.

@Anubis: я имею в виду технологию, которую вы используете для своих визуальных компонентов (например: JTextbox, JFrame и т. Д. — это все классы из среды Swing). Когда вы создаете настольное приложение, вы используете одну из этих платформ (вы используете Swing или SWT, но не смешиваете). Таким образом, решения различаются в зависимости от того, какую группу классов вы используете.

@Ryan Райан спасибо за это, но сейчас я не могу смотреть видео. Письменное руководство гораздо предпочтительнее.

@helios Хелиос, тогда я сказал тебе, что использую jTable. да, я использую jFrames и тому подобное. Можете ли вы дать решение сейчас. Спасибо!

5 ответов

Я нашел 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); >> 

Я написал компонент 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 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(); > > > 

Спасибо за ваш код. Работает нормально. Но я прошу вас попробовать мое принятое решение ниже. Это работает действительно хорошо. Я склонен принять это как ответ, потому что это поможет другим, которые будут искать об этом в будущем. Если я могу принять два ответа, то, конечно, я тоже приму ваш, не могу принять два ответа. Надеюсь, ты не будешь возражать. Спасибо за помощь..

Читайте также:  Класс наследует класс php

Библиотека LGoodDatePicker включает компонент DatePicker (swing), который позволяет пользователю выбирать даты из календарь. (По умолчанию пользователи могут также вводить даты с клавиатуры, но при желании можно отключить ввод в клавиатуру). DatePicker имеет автоматическую проверку данных, что означает (между прочим), что любая дата, которую вводит пользователь, всегда будет конвертирована в нужный формат даты.

Справедливое раскрытие: я являюсь основным разработчиком.

Поскольку DatePicker является компонентом swing, вы можете добавить его в любой другой контейнер swing, включая (в вашем сценарии) ячейки JTable.

Наиболее часто используемые форматы дат автоматически поддерживаются, и при необходимости могут быть добавлены дополнительные форматы дат.

Чтобы обеспечить нужный формат даты, вы, скорее всего, захотите, чтобы выбранный формат был стандартным «форматом отображения» для DatePicker. Форматы могут быть указаны с использованием шаблонов JavaT опубликовать страницу.

Изображение 161076

Изображение 460245

Изображение 460246

Еще один простой способ в 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 :) 

Ответы только для ссылок меньше, чем оптимальные при переполнении стека (гниль ссылок и другие причины). Пожалуйста, напишите резюме связанной статьи, желательно с ключевым исходным кодом и пояснениями.

Источник

How to use JDatePicker to display calendar component

This tutorial shows you how to use the JDatePicker open-source library in order to display a calendar component in Java Swing programs with some necessary customizations. You will end up creating the following program:

Читайте также:  Новая строка символ php

calendar component demo

1. Quick start with JDatePicker

Click here to download the JDatePicker library from SourceForge. The latest version as of now is 1.3.2. Extract the downloaded archive JDatePicker-1.3.2-dist.zip , and then find and add the jdatepicker-1.3.2.jar file to your project’s classpath.

It’s pretty simple to create and add a date picker component to a container, i.e. a JFrame. It involves in choosing an appropriate DateModel which is required by a JDatePanelImpl which is required by a JDatePickerImpl — which is then added to the container. For example, the following code snippet creates a date picker component using the UtilDateModel , and then adds it to the frame:

UtilDateModel model = new UtilDateModel(); JDatePanelImpl datePanel = new JDatePanelImpl(model); JDatePickerImpl datePicker = new JDatePickerImpl(datePanel); frame.add(datePicker);

date picker component

It contains a disabled, read-only text field on the left, and an ellipsis button that will pop up a calendar when clicked:

Calendar

date selected

2. Dealing with Date Models

The JDatePicker library provides three date models which correspond to three date time types in Java:

  • UtilDateModel : the date picker will return the selected date as an object of type java.util.Date .
  • CalendarDateModel : the date picker will return the selected date as an object of type java.util.Calendar .
  • SqlDateModel : the date picker will return the selected date as an object of type java.sql.Date .

the JDatePickerImpl returns the selected date object of appropriate type. For example, the following statement gets the selected date in case the model is UtilDateModel :

Date selectedDate = (Date) datePicker.getModel().getValue();
Calendar selectedValue = (Calendar) datePicker.getModel().getValue(); Date selectedDate = selectedValue.getTime();
java.sql.Date selectedDate = (java.sql.Date) datePicker.getModel().getValue();

3. Setting initial date

UtilDateModel model = new UtilDateModel(); model.setDate(1990, 8, 24);

That sets the initial date to September 24, 1990 (because in Java, the month number is zero-based). Result:

Читайте также:  Java get month from date

Setting initial date on the calendar

If you want to set initial date for the text field, use the following statement:

setting initial date on the text field

4. Customizing the date format

The default format of the date shown in the text field may not suite your need. In such case, you can create your own class that extends the javax.swing.JFormattedTextField.AbstractFormatter class. For example:

package net.codejava.swing; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.swing.JFormattedTextField.AbstractFormatter; public class DateLabelFormatter extends AbstractFormatter < private String datePattern = "yyyy-MM-dd"; private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern); @Override public Object stringToValue(String text) throws ParseException < return dateFormatter.parseObject(text); >@Override public String valueToString(Object value) throws ParseException < if (value != null) < Calendar cal = (Calendar) value; return dateFormatter.format(cal.getTime()); >return ""; > >

As you can see, this class overrides the stringToValue() method to parse a String to a Date object; and overrides the valueToString() method to format the Calendar object to a String . The date pattern to use is yyy-MM-dd.

And pass an instance of this custom class when constructing the date picker component as follows:

JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter());

customized date format

You can download the Java source files under the attachment section.

References:

Other Java Swing Tutorials:

About the Author:

Nam Ha Minh is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.

Источник

Оцените статью