2009-03-17 30 views

Trả lời

62

Đối với một bảng chọn thời gian bạn có thể sử dụng một JSpinner và thiết lập một JSpinner.DateEditor rằng chỉ có các chương trình giá trị thời gian.

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 
+1

wow thật đơn giản và tốt! Cảm ơn bạn là tuyệt vời! – JavaNullPointer

+0

Bạn cũng có thể muốn sử dụng một thư viện như JDatePicker: http://jdatepicker.org kết hợp để chọn ngày. – juanheyns

+4

Thư viện [LGoodDatePicker] (https://github.com/LGoodDatePicker/LGoodDatePicker) bao gồm thành phần ** DateTimePicker tốt **. (Cũng như các lớp DatePicker và TimePicker riêng lẻ). Ba thành phần đơn giản và dễ sử dụng. Dưới đây là một số ảnh chụp màn hình của các thành phần và ứng dụng demo. [Ảnh chụp màn hình 1] (http://i.stack.imgur.com/ghDdI.png), [Ảnh chụp màn hình 2] (http://i.stack.imgur.com/QXgWE.png). Trang chủ dự án được đặt tại https://github.com/LGoodDatePicker/LGoodDatePicker. – BlakeTNC

1

Như bạn đã nói Bộ chọn ngày dễ dàng, có nhiều thứ ở đó.

Đối với bộ chọn Thời gian, hãy xem cách Lịch Google thực hiện khi tạo mục nhập mới. Nó cho phép bạn gõ vào bất cứ điều gì trong khi đồng thời nó có một thả xuống trong gia số 30 phút. Trình đơn thả xuống thay đổi khi bạn thay đổi phút.

Nếu bạn cần phải cho phép người dùng chọn giây, sau đó tốt nhất bạn có thể làm là phân typ/thả xuống kết hợp

10

Sử dụng kết hợp cả hai .. đó là những gì tôi đã làm:

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; 
} 
14

Bạn có thể mở rộng thành phần JXDatePicker swingx:

"JXDatePicker chỉ xử lý ngày mà không cần thời gian Khá thường xuyên chúng ta cần phải cho phép người dùng chọn một ngày và trong một thời gian Đây là một ví dụ về cách sử dụng.. JXDatePicker để xử lý ngày giờ với nhau. "

http://wiki.java.net/twiki/bin/view/Javadesktop/JXDateTimePicker

EDIT: Bài viết này biến mất khỏi trang web, nhưng như SingleShot phát hiện, nó vẫn còn có sẵn trong một kho lưu trữ internet. Để chắc chắn, đây là ví dụ hoạt động đầy đủ:

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); 
    } 
} 
+1

Liên kết này hiện đã biến mất, tuy nhiên [Wayback Machine] (http://archive.org/web/web.php) có nó [ở đây] (http://web.archive.org/web/20111118105909/http: //wiki.java.net/twiki/bin/view/Javadesktop/JXDateTimePicker?TWIKISID=cc05dea1611ad043796cd67ed476d711;skin=print). – SingleShot

+0

Tôi bao gồm bây giờ ở đây mã đầy đủ của đá quý nhỏ này :) – lbalazscs

+1

Có trình soạn thảo ô, để đặt nó vào ô bảng? – whatswrong

Các vấn đề liên quan