2012-07-31 28 views
6

En otros lenguajes como Visual Basic, C#, en ocasiones en las que desea que el usuario introduzca una fecha, por ejemplo en un cuadro de texto, podemos hacer un calendario a aparecer una vez que se hace clic en él. Entonces, el usuario puede hacer clic en la fecha correspondiente y esa fecha se colocará en el cuadro de texto.visualización de calendario, elegir una fecha en Java

Y por el camino podemos deshacernos de los problemas que pueden ser causados ​​debido a las fechas en un formato incorrecto. Necesito saber cómo podemos lograr esto en Java?

En realidad, tengo que combinar esto con un JTable. hay una columna donde se debe ingresar la fecha. Pero los usuarios pueden ingresar fechas en varios formatos. Así que pensé en ir a algo como esto. Espero que haya una manera de hacer esto, fácilmente.

¿Alguien me puede mostrar cómo hacerlo? Cualquier ayuda es muy apreciada ..

Gracias.

+2

que no tienen idea de lo que es JTable, sin embargo lo que está buscando se llama un Selector de fecha, y si google Selector de fecha y JTable a obtener varios resultados que podrían ser lo que busca. Puede encontrar algunas otras preguntas útiles aquí http://stackoverflow.com/search?q=jTable+Date+Picker – hectorg87

+3

Debe indicar qué marco de componentes visuales está utilizando porque Java tiene mucho si los hay (varios para cada entorno). En el escritorio puede usar: AWT, Swing, SWT por ejemplo. – helios

+2

@helios Lo siento, no entiendo exactamente lo que quiere decir "marco de componentes visuales". Necesito usar esto en swing.jtable. ¿Eso responderá a tu pregunta? – Anubis

Respuesta

14

He encontrado JXDatePicker como una mejor solución a esto. Da lo que necesita y es muy fácil de usar.

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

Enlace actual (?): Https://java.net/projects/swingx/downloads/directory/releases –

-1
  1. Abra el documento de código fuente de Java y vaya al objeto JTable se haya creado dentro de su clase de oscilación.

  2. crear un nuevo objeto TableModel que mantiene una DatePickerTable. Debe crear DatePickerTable con un rango de valores de fecha en formato MMDDYYYY. El primer valor es la fecha de inicio y el último es la fecha de finalización. En el código, esto se parece a:

    TableModel datePicker = new DatePickerTable("01011999","12302000"); 
    
  3. Ajuste el intervalo de visualización en el objeto selector de fechas. De forma predeterminada, se muestra cada día, pero puede establecer un intervalo regular. Para establecer un intervalo de 15 días entre las opciones de fecha, utilice este código:

    datePicker.interval = 15; 
    
  4. adjuntar su modelo de tabla en su JTable:

    JTable newtable = new JTable (datePicker); 
    

    La aplicación Java tiene ahora un cuadro de diálogo de selección de fecha desplegable .

+1

Gracias @Sachin Mhetre. Pero lo que sugirió no funciona. No existe una clase como DatePickerTable (Netbeans lo subraya). ¿Es eso una especie de complemento? – Anubis

9

Escribí un componente 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

Gracias por su código. Funciona bien. Pero le pido que pruebe mi solución aceptada a continuación. Funciona realmente bien. Tiendo a aceptarlo como la respuesta, porque ayudará a otros que buscarán sobre esto en el futuro.Si puedo aceptar dos respuestas, entonces, por supuesto, también aceptaré la tuya, no puedo aceptar dos respuestas. Espero que no te importe. Gracias por la ayuda. – Anubis

5

La biblioteca LGoodDatePicker incluye un (columpio) DatePicker componente, que permite que el usuario seleccione las fechas de un calendario. (De forma predeterminada, los usuarios también pueden escribir fechas desde el teclado, pero la entrada del teclado se puede deshabilitar si se desea). DatePicker tiene validación de datos automática, lo que significa (entre otras cosas) que cualquier fecha que ingrese el usuario siempre se convertirá al formato de fecha deseado.

Revelación justa: soy el desarrollador principal.

Desde el DatePicker es un componente de oscilación, se puede añadir a cualquier otro recipiente oscilación incluyendo (en el escenario) las células de un JTable.

Los formatos de fecha más comúnmente utilizados son automáticamente compatibles, y se pueden agregar formatos de fecha adicionales si así lo desea.

Para forzar el formato de fecha deseado, lo más probable es que desee establecer el formato elegido para que sea el "formato de visualización" predeterminado para DatePicker. Los formatos se pueden especificar utilizando Java 8 DateTimeFormatter Patterns. No importa qué tipo de usuario (o clics), la fecha siempre se convertirá al formato especificado tan pronto como el usuario termine.

Además del DatePicker, la biblioteca también tiene los componentes TimePicker y DateTimePicker. He pegado capturas de pantalla de todos los componentes (y el programa de demostración) a continuación.

La biblioteca se puede instalar en su proyecto Java desde el proyecto release page.

La página de inicio del proyecto está en Github en:
https://github.com/LGoodDatePicker/LGoodDatePicker.


DateTimePicker screenshot


DateTimePicker examples


Demo screenshot

1

Otro método fácil en Netbeans está también disponible aquí, hay bibliotecas dentro de sí Netbeans, donde las soluciones para este tipo de las situaciones están disponibles.Seleccione el más relevante también. Es mucho más fácil. Después de hacer el presc pasos en el enlace, reinicie 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

Respuestas de solo enlace son menos que óptimas en el desbordamiento de la pila (rotura del enlace, y otras razones) . Por favor, escriba un resumen del artículo vinculado, preferiblemente con el código fuente clave y la explicación. –

+0

Gracias por corregirme BasilBourque –

Cuestiones relacionadas