2012-07-31 235 views
6

在其他语言(如VB,C#)中,如果希望用户输入日期,例如在文本框中输入日期,我们可以在点击日历后显示日历。因此,用户可以点击相应的日期,该日期将被置于文本框中。显示日历以在java中选择日期

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

其实我需要把它和JTable结合起来。有一列需要输入日期。但用户可以用各种格式输入日期。所以我想到了这样的事情。希望有一种方法可以轻松做到这一点。

有人请告诉我如何做到这一点。任何帮助非常感谢..

谢谢。

+2

我不知道JTable的是什么,但你正在寻找被称为一个日期选取器,如果谷歌的JTable日期选取器你会得到一些结果,这可能是你在找什么。你可能会在这里找到一些其他有用的问题http://stackoverflow.com/search?q=jTable+Date+Picker – hectorg87 2012-07-31 09:23:33

+3

你应该指出你使用的是什么可视组件框架,因为Java有很多,如果它们(每个环境有几个)。在桌面上,您可以使用:AWT,Swing,SWT。 – helios 2012-07-31 09:26:07

+2

@helios对不起,我不明白你的意思,“视觉组件框架”。我需要在swing.jtable中使用它。这会回答你的问题吗? – Anubis 2012-07-31 09:34:33

回答

14

我发现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); 
    } 
} 
+0

实际的链接(?):https://java.net/projects/swingx/downloads/directory/releases – 2015-08-06 21:04:29

-1
  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应用程序现在有一个下拉日期选择对话框。

+1

谢谢@Sachin Mhetre。但是你的建议不起作用。没有DatePickerTable这样的类(Netbeans强调它)。那是一种插件吗? – Anubis 2012-07-31 09:41:30

9

我写了一个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(); 
     } 
    } 
} 
+0

感谢您的代码。它工作正常。但我要求你尝试下面我接受的解决方案。它工作得很好。我倾向于接受它作为答案,因为它会帮助其他人在未来寻找这个问题。如果我能接受两个答案,那么我当然也会接受你的答案,不能接受两个答案。希望你不会介意。感谢您的帮助.. – Anubis 2012-07-31 11:35:21

5

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

公平的披露:我是主要开发者。

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

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

要强制执行所需的日期格式,最有可能将您选择的格式设置为DatePicker的默认“显示格式”。格式可以通过使用Java 8 DateTimeFormatter Patterns来指定。无论用户输入什么内容(或点击),只要用户完成,日期就会始终转换为指定的格式。

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

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

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


DateTimePicker screenshot


DateTimePicker examples


Demo screenshot

1

在Netbeans的另一种简单的方法也是缴费这里, 有内部的Netbeans本身,文库,其中对于这种类型的解决方案情况是可用的。选择相关的一个也很容易。在完成presc后在链接的步骤中,请重新启动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 :) 
+0

仅链接的答案是不是最佳的堆栈溢出(链接腐烂等原因) 。请写下链接文章的摘要,最好是关键源代码和说明。 – 2017-12-13 15:22:14

+0

Thankyou纠正我BasilBourque – 2017-12-14 05:27:56

相关问题