import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; * 日期选择器控件 * @author jianggujin @SuppressWarnings ( "serial" ) public final class JDateChooser extends JDialog // 定义相关参数 private int year = 0 ; private int month = 0 ; private int date = 0 ; * 日期选择背景色 private Color selectColor = Color.green; * 日期背景色 private Color dateColor = Color.white; * 日期鼠标进入背景色 private Color dateHoverColor = Color.lightGray; * 日期标题背景色 private Color dateTitleColor = Color.gray; * 日期标题字体颜色 private Color dateTitleFontColor = Color.black; * 日期字体颜色 private Color dateFontColor = Color.black; * 日期是否有效标志 private boolean flag = false ; * 最小年份 private int minYear = 1900 ; * 最大年份 private int maxYear = 2050 ; // 定义所需组件 * 上一年 private JButton jbYearPre; * 下一年 private JButton jbYearNext; * 上一月 private JButton jbMonthPre; * 下一月 private JButton jbMonthNext; * 年份下拉选择框 private JComboBox<String> jcbYear; * 月份下拉选择框 private JComboBox<String> jcbMonth; * 天标签 private JLabel[][] jlDays; private JButton jbChoose; private JButton jbToday; private JButton jbCancel; * 程序主方法 * @param args * 命令参数 public static void main (String[] args) UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); catch (Exception e) JDateChooser gg = new JDateChooser(); gg.showDateChooser(); System.out.println(gg.getDateFormat( "yyyy-MM-dd" )); * 显示对话框 public void showDateChooser () setVisible( true ); * 关闭对话框 public void closeDateChooser () this .dispose(); * 设置时间 * @param year * 年份 1900-2050 * @param month * 月份 1-12 * @param date * 天 public void setDate ( int year, int month, int date) if (year >= minYear && year <= maxYear) this .year = year; return ; if (month >= 1 && month <= 12 ) this .month = month; return ; if (date > 0 && date <= getDaysInMonth(year, month)) this .date = date; return ; * 获得用户操作是否有效标志 * @return 事件是否有效 public boolean getFlag () return flag; * 构造方法 public JDateChooser () initComponent(); initComponentData(); addComponent(); addListener(); setDialogAttribute(); * 实例化组件 private void initComponent () jbYearPre = new JButton(); jbYearNext = new JButton(); jbMonthPre = new JButton(); jbMonthNext = new JButton(); jcbYear = new JComboBox<String>(); jcbMonth = new JComboBox<String>(); jlDays = new JLabel[ 7 ][ 7 ]; jbChoose = new JButton(); jbToday = new JButton(); jbCancel = new JButton(); * 初始化组件数据 private void initComponentData () jbYearPre.setText( "←" ); jbYearNext.setText( "→" ); jbMonthPre.setText( "↑" ); jbMonthNext.setText( "↓" ); Calendar calendar = Calendar.getInstance(); if (year != 0 && month != 0 && date != 0 ) calendar.set(year, month - 1 , date); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1 ; date = calendar.get(Calendar.DAY_OF_MONTH); initYear(); jcbYear.setSelectedItem(year + "年" ); for ( int i = 1 ; i <= 12 ; i++) jcbMonth.addItem(i + "月" ); jcbMonth.setSelectedItem(month + "月" ); for ( int i = 0 ; i < 7 ; i++) JLabel temp = new JLabel(); temp.setHorizontalAlignment(JLabel.CENTER); temp.setVerticalAlignment(JLabel.CENTER); temp.setOpaque( true ); temp.setBackground(dateTitleColor); temp.setForeground(dateTitleFontColor); jlDays[ 0 ][i] = temp; for ( int i = 1 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) JLabel temp = new JLabel(); temp.setHorizontalAlignment(JLabel.CENTER); temp.setVerticalAlignment(JLabel.CENTER); temp.setOpaque( true ); temp.setForeground(dateFontColor); jlDays[i][j] = temp; String[] days = { "日" , "一" , "二" , "三" , "四" , "五" , "六" }; for ( int i = 0 ; i < 7 ; i++) jlDays[ 0 ][i].setText(days[i]); jbChoose.setText( "选择" ); jbToday.setText( "今日" ); jbCancel.setText( "取消" ); changeDate(); * 初始化显示年份范围 private void initYear () jcbYear.removeAllItems(); for ( int i = minYear; i <= maxYear; i++) jcbYear.addItem(i + "年" ); * 添加组件 private void addComponent () // 添加背部组件 JPanel north = new JPanel(); north.add(jbYearPre); north.add(jbMonthPre); north.add(jcbYear); north.add(jcbMonth); north.add(jbMonthNext); north.add(jbYearNext); this .add(north, "North" ); // 添加中间组件 JPanel center = new JPanel( new GridLayout( 7 , 7 )); for ( int i = 0 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) center.add(jlDays[i][j]); this .add(center); // 添加南部组件 JPanel jpSouth = new JPanel(); jpSouth.add(jbChoose); jpSouth.add(jbToday); jpSouth.add(jbCancel); this .add(jpSouth, "South" ); * 获得指定年指定月份的天数 * @param year * 年份 * @param month * 月份 * @return 天数 private int getDaysInMonth ( int year, int month) switch (month) case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : return 31 ; case 4 : case 6 : case 9 : case 11 : return 30 ; case 2 : if (isLeapYear(year)) return 29 ; return 28 ; default : return 0 ; * 清空日期 private void clearDate () for ( int i = 1 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) jlDays[i][j].setText( "" ); * 更改日期 private void changeDate () refreshLabelColor(); clearDate(); Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1 , 1 ); int day_in_week = calendar.get(Calendar.DAY_OF_WEEK); int days = getDaysInMonth(year, month); if (date > days) date = 1 ; int temp = 0 ; for ( int i = day_in_week - 1 ; i < 7 ; i++) temp++; jlDays[ 1 ][i].setText(temp + "" ); if (temp == date) jlDays[ 1 ][i].setBackground(selectColor); for ( int i = 2 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) temp++; if (temp > days) return ; jlDays[i][j].setText(temp + "" ); if (temp == date) jlDays[i][j].setBackground(selectColor); * 添加监听 private void addListener () LabelMouseListener labelMouseListener = new LabelMouseListener(); for ( int i = 1 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) jlDays[i][j].addMouseListener(labelMouseListener); ButtonActionListener buttonActionListener = new ButtonActionListener(); jbYearPre.addActionListener(buttonActionListener); jbYearNext.addActionListener(buttonActionListener); jbMonthPre.addActionListener(buttonActionListener); jbMonthNext.addActionListener(buttonActionListener); jbChoose.addActionListener(buttonActionListener); jbToday.addActionListener(buttonActionListener); jbCancel.addActionListener(buttonActionListener); ComboBoxItemListener comboBoxItemListener = new ComboBoxItemListener(); jcbYear.addItemListener(comboBoxItemListener); jcbMonth.addItemListener(comboBoxItemListener); * 解析年份或月份 * @param yearOrMonth * 年份或月份字符串 * @return 年份或月份 private int parseYearOrMonth (String yearOrMonth) return Integer.parseInt(yearOrMonth.substring( 0 , yearOrMonth.length() - 1 )); * 判断是否为闰年 * @param year * 年份 * @return true 闰年<br/> * false 平年 private boolean isLeapYear ( int year) return (year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0 ); * 设置对话框属性 private void setDialogAttribute () this .setDefaultCloseOperation(DISPOSE_ON_CLOSE); this .setSize( 400 , 300 ); this .setLocationRelativeTo( null ); // 显示为模态对话框 this .setModal( true ); this .setTitle( "日期选择器" ); this .setIconImage(( new ImageIcon( this .getClass().getResource( "/calendar.png" ))).getImage()); * 刷新日期标签背景颜色 private void refreshLabelColor () for ( int i = 1 ; i < 7 ; i++) for ( int j = 0 ; j < 7 ; j++) jlDays[i][j].setBackground(dateColor); * 获得显示最小年份 * @return 显示最小年份 public int getMinYear () return minYear; * 获得显示最大年份 * @return 显示最大年份 public int getMaxYear () return maxYear; * 设置显示最小年份和最大年份(1900-9999) * @param minYear * 最小年份 * @param maxYear * 最大年份 public void setMinAndMaxYear ( int minYear, int maxYear) if (minYear > maxYear || minYear < 1900 || maxYear > 9999 ) return ; this .minYear = minYear; this .maxYear = maxYear; initYear(); * 获得选中背景颜色 * @return 选中背景颜色 public Color getSelectColor () return selectColor; * 设置选中背景颜色 * @param selectColor * 选中背景颜色 public void setSelectColor (Color selectColor) this .selectColor = selectColor; * 获得日期背景颜色 * @return 日期背景颜色 public Color getDateColor () return dateColor; * 设置日期背景颜色 * @param dateColor * 日期背景颜色 public void setDateColor (Color dateColor) this .dateColor = dateColor; * 获得日期鼠标进入背景颜色 * @return 日期鼠标进入背景颜色 public Color getDetaHoverColor () return dateHoverColor; * 设置日期鼠标进入背景颜色 * @param dateHoverColor * 日期鼠标进入背景颜色 public void setDateHoverColor (Color dateHoverColor) this .dateHoverColor = dateHoverColor; * 获得日期标题背景颜色 * @return 日期标题背景颜色 public Color getDateTitleColor () return dateTitleColor; * 设置日期标题背景颜色 * @param dateTitleColor * 日期标题背景颜色 public void setDateTitleColor (Color dateTitleColor) this .dateTitleColor = dateTitleColor; * 获得日期标题字体颜色 * @return 日期标题字体颜色 public Color getDateTitleFontColor () return dateTitleFontColor; * 设置日期标题字体颜色 * @param dateTitleFontColor * 日期标题字体颜色 public void setDateTitleFontColor (Color dateTitleFontColor) this .dateTitleFontColor = dateTitleFontColor; * 获得日期字体颜色 * @return 日期字体颜色 public Color getDateFontColor () return dateFontColor; * 设置日期字体颜色 * @param dateFontColor * 日期字体颜色 public void setDateFontColor (Color dateFontColor) this .dateFontColor = dateFontColor; * 获得选择年份 * @return 选择年份 public int getYear () return year; * 获得选中月份 * @return 选中月份 public int getMonth () return month; * 获得选中天为当月第几天 * @return 选中天为当月第几天 public int getDate () return date; * 获得选中天为一周中第几天 * @return 选中天为一周中第几天 public int getDayOfWeek () return getCalendar().get(Calendar.DAY_OF_WEEK); * 获得选中天为一年中第几天 * @return 选中天为一年中第几天 public int getDayOfYear () return getCalendar().get(Calendar.DAY_OF_YEAR); * 获得日期对象 * @return 日期对象 public Date getDateObject () return getCalendar().getTime(); * 获得以指定规则格式化的日期字符串 * @param format * 格式化规则 * @return 日期字符串 public String getDateFormat (String format) return new SimpleDateFormat(format).format(getDateObject()); * 获得Calendar对象 * @return Calendar对象 private Calendar getCalendar () Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1 , date); return calendar; * 标签鼠标监听 * @author jianggujin final class LabelMouseListener extends MouseAdapter @Override public void mouseClicked (MouseEvent e) JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals( "" )) int date = Integer.parseInt(temp.getText()); if (date != JDateChooser. this .date) JDateChooser. this .date = date; refreshLabelColor(); temp.setBackground(selectColor); @Override public void mouseEntered (MouseEvent e) JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals( "" )) temp.setBackground(dateHoverColor); @Override public void mouseExited (MouseEvent e) JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals( "" )) if (Integer.parseInt(temp.getText()) != date) temp.setBackground(dateColor); temp.setBackground(selectColor); * 按钮动作监听 * @author jianggujin final class ButtonActionListener implements ActionListener public void actionPerformed (ActionEvent e) if (e.getSource() == jbYearPre) int select = jcbYear.getSelectedIndex(); if (select > 0 ) jcbYear.setSelectedIndex(select - 1 ); else if (e.getSource() == jbYearNext) int select = jcbYear.getSelectedIndex(); if (select < jcbYear.getItemCount() - 1 ) jcbYear.setSelectedIndex(select + 1 ); else if (e.getSource() == jbMonthPre) int select = jcbMonth.getSelectedIndex(); if (select > 0 ) jcbMonth.setSelectedIndex(select - 1 ); else if (e.getSource() == jbMonthNext) int select = jcbMonth.getSelectedIndex(); if (select < jcbMonth.getItemCount() - 1 ) jcbMonth.setSelectedIndex(select + 1 ); else if (e.getSource() == jbChoose) flag = true ; closeDateChooser(); else if (e.getSource() == jbToday) flag = true ; Calendar calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1 ; date = calendar.get(Calendar.DATE); closeDateChooser(); else if (e.getSource() == jbCancel) flag = false ; closeDateChooser(); * 下拉选择框项改变监听 * @author jianggujin final class ComboBoxItemListener implements ItemListener public void itemStateChanged (ItemEvent e) if (e.getSource() == jcbYear) int year = parseYearOrMonth(jcbYear.getSelectedItem().toString()); if (year != JDateChooser. this .year) JDateChooser. this .year = year; changeDate(); else if (e.getSource() == jcbMonth) int month = parseYearOrMonth(jcbMonth.getSelectedItem().toString()); if (month != JDateChooser. this .month) JDateChooser. this .month = month; changeDate(); &lt;span style="vertical-align: -webkit-baseline-middle;font-size:16px;font-weight:bold;"&gt;开始时间:&lt;/span&gt;&amp;nbsp; &lt;input name="startTime" id="startTime" type="text" cl 想实现一个可以 选择 年份和时间段的 日期 选择器 ,如下所示 微信小程序自带的picker组件虽然能实现如上的内容,但不能实现样式的修改,不太符合小程序的设计主题,所以考虑了以下两种方法来实现如上的设计。 自定义 date-picker 把要实现的date-picker封装为一个组件,组建内套用小程序自带的picker-view组件,其中picker_view-column表示不同的 选择 列,这样可以方便地实现 try { JFrame frame = new JFrame(); UIManager.setLookAndFeel("com.sun. java . swing .plaf.windows.WindowsLookAndFeel"); Swing Utilities.updateComponentTreeUI(frame); com.qt.datapicker.DateTimePanel dateTimePanel = new com.qt.datapicker.DateTimePanel(true); frame.getContentPane().add(dateTimePanel); //dateTimePanel.getDateTimeValue();取 选择 结果值 frame.setSize(800, 600); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception * To change this template, choose Tools | Template Manager * and open the template in the editor. import java .awt.BasicStroke; import java .awt.BorderLayo... 示例代码段 JLabel dateJLabel = new JLabel(" 日期 :"); final DatePicker datePicker1 = DatePickerUtil.getDatePicker(); JButton startDateBtn = new JButton("开始时间"); startDateBtn.addActi
Java 自定义 动态表单可以实现根据用户需求产生不同表单的功能。这样的动态表单可以根据不同的业务需求灵活添加、删除、修改表单项,而不需要修改源码。 Java 自定义 动态表单的实现需要先定义表单的属性,例如表单名称、表单ID、表单项类型、表单项名称、是否必填等属性。 在实现动态表单时可以使用 Java Web框架如Spring MVC等,可以使用前端框架如AngularJS、React、Vue.js等来实现表单的渲染和交互。动态表单可以通过数据库、XML文件等储存表单的属性,并通过 Java 程序读取、解析和渲染。 实现动态表单需要考虑不同表单项的复杂性,例如文本框、下拉框、复选框、单选框、文件上传、 日期 选择 等。此外,还需要考虑表单项的校验和提交功能。在校验时可以使用正则表达式、jQuery插件等实现表单项的合法性校验,而在提交时需要将表单项的值写入到数据库或XML等持久化储存器中。 Java 自定义 动态表单的优点是可以根据不同的业务需求实现不同的表单。通过动态表单,可以大幅度提升表单的定制性和灵活性,减少重复开发的工作量。同时,动态表单可以使得用户界面更加友好,提升用户体验,是目前Web开发中广泛应用的技术。