Есть ли хороший и бесплатный выбор даты и времени для Java Swing? [закрытый]
есть ли хороший и бесплатный выбор даты и времени для Java Swing?
есть много выбора даты, но нет выбора даты и времени. Это самое близкое, с чем я столкнулся до сих пор: В поисках выбора даты и времени
кто-нибудь?
6 ответов:
для выбора времени, вы можете использовать jspinner и установить экран.DateEditor, который показывает только значение времени.
JSpinner timeSpinner = new JSpinner( new SpinnerDateModel() ); JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(timeSpinner, "HH:mm:ss"); timeSpinner.setEditor(timeEditor); timeSpinner.setValue(new Date()); // will only show the current time
вы можете расширить компонент swingx JXDatePicker:
" JXDatePicker обрабатывает только даты без времени. Довольно часто нам нужно позволить пользователю выбрать дату и время. Это пример того, как использовать JXDatePicker для обработки даты и времени вместе."
http://wiki.java.net/twiki/bin/view/Javadesktop/JXDateTimePicker
EDIT: эта статья исчезла из интернета, но, как обнаружил SingleShot, она все еще доступно в интернет-архиве. Просто чтобы быть уверенным, вот полный рабочий пример:
import org.jdesktop.swingx.calendar.SingleDaySelectionModel; import org.jdesktop.swingx.JXDatePicker; import javax.swing.*; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.DateFormatter; import java.text.DateFormat; import java.text.ParseException; import java.util.*; import java.awt.*; /** * This is licensed under LGPL. License can be found here: http://www.gnu.org/licenses/lgpl-3.0.txt * * This is provided as is. If you have questions please direct them to charlie.hubbard at gmail dot you know what. */ public class DateTimePicker extends JXDatePicker { private JSpinner timeSpinner; private JPanel timePanel; private DateFormat timeFormat; public DateTimePicker() { super(); getMonthView().setSelectionModel(new SingleDaySelectionModel()); } public DateTimePicker( Date d ) { this(); setDate(d); } public void commitEdit() throws ParseException { commitTime(); super.commitEdit(); } public void cancelEdit() { super.cancelEdit(); setTimeSpinners(); } @Override public JPanel getLinkPanel() { super.getLinkPanel(); if( timePanel == null ) { timePanel = createTimePanel(); } setTimeSpinners(); return timePanel; } private JPanel createTimePanel() { JPanel newPanel = new JPanel(); newPanel.setLayout(new FlowLayout()); //newPanel.add(panelOriginal); SpinnerDateModel dateModel = new SpinnerDateModel(); timeSpinner = new JSpinner(dateModel); if( timeFormat == null ) timeFormat = DateFormat.getTimeInstance( DateFormat.SHORT ); updateTextFieldFormat(); newPanel.add(new JLabel( "Time:" ) ); newPanel.add(timeSpinner); newPanel.setBackground(Color.WHITE); return newPanel; } private void updateTextFieldFormat() { if( timeSpinner == null ) return; JFormattedTextField tf = ((JSpinner.DefaultEditor) timeSpinner.getEditor()).getTextField(); DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory(); DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter(); // Change the date format to only show the hours formatter.setFormat( timeFormat ); } private void commitTime() { Date date = getDate(); if (date != null) { Date time = (Date) timeSpinner.getValue(); GregorianCalendar timeCalendar = new GregorianCalendar(); timeCalendar.setTime( time ); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, timeCalendar.get( Calendar.HOUR_OF_DAY ) ); calendar.set(Calendar.MINUTE, timeCalendar.get( Calendar.MINUTE ) ); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date newDate = calendar.getTime(); setDate(newDate); } } private void setTimeSpinners() { Date date = getDate(); if (date != null) { timeSpinner.setValue( date ); } } public DateFormat getTimeFormat() { return timeFormat; } public void setTimeFormat(DateFormat timeFormat) { this.timeFormat = timeFormat; updateTextFieldFormat(); } public static void main(String[] args) { Date date = new Date(); JFrame frame = new JFrame(); frame.setTitle("Date Time Picker"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DateTimePicker dateTimePicker = new DateTimePicker(); dateTimePicker.setFormats( DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM ) ); dateTimePicker.setTimeFormat( DateFormat.getTimeInstance( DateFormat.MEDIUM ) ); dateTimePicker.setDate(date); frame.getContentPane().add(dateTimePicker); frame.pack(); frame.setVisible(true); } }
используйте оба вместе.. вот что я сделал:
public static JPanel buildDatePanel(String label, Date value) { JPanel datePanel = new JPanel(); JDateChooser dateChooser = new JDateChooser(); if (value != null) { dateChooser.setDate(value); } for (Component comp : dateChooser.getComponents()) { if (comp instanceof JTextField) { ((JTextField) comp).setColumns(50); ((JTextField) comp).setEditable(false); } } datePanel.add(dateChooser); SpinnerModel model = new SpinnerDateModel(); JSpinner timeSpinner = new JSpinner(model); JComponent editor = new JSpinner.DateEditor(timeSpinner, "HH:mm:ss"); timeSpinner.setEditor(editor); if(value != null) { timeSpinner.setValue(value); } datePanel.add(timeSpinner); return datePanel; }
есть FLib-JCalendar компонент с комбинированным выбором даты и времени.
Как вы сказали, выбор даты легко, есть много там.
Что касается выбора времени, проверьте, как Google Calendar делает это при создании новой записи. Он позволяет вводить что-либо, в то же время он имеет выпадающее меню с шагом 30 минут. Выпадающее меню изменяется при изменении минут.
Если вам нужно разрешить пользователю выбирать секунды, то лучшее, что вы можете сделать, это типизируемая/выпадающая комбинация
лучшие из лучших, JCalendar: http://www.toedter.com/en/jcalendar/index.html Лицензия LGPL.
Comments