2012-07-31 13 views
6

W innych językach, takich jak VB, C#, w sytuacjach, gdy chcesz, aby użytkownik wprowadzał datę, powiedz w polu tekstowym, możemy stworzyć kalendarz, który pojawi się po kliknięciu. Użytkownik może kliknąć odpowiednią datę, a data zostanie umieszczona w polu tekstowym.Wyświetl kalendarz, aby wybrać datę w java

W ten sposób możemy pozbyć się problemów, które mogą być spowodowane datami w niewłaściwym formacie. Muszę wiedzieć, jak możemy to osiągnąć w Javie?

Właściwie muszę to połączyć z JTable. jest kolumna, w której należy wprowadzić datę. Ale użytkownicy mogą wprowadzać daty w różnych formatach. Więc pomyślałem o tym, żeby pójść do czegoś takiego. Mam nadzieję, że istnieje sposób, aby to zrobić, z łatwością.

Czy ktoś może mi pokazać, jak to zrobić. Każda pomoc jest bardzo ceniona ..

Dziękuję.

+2

Nie mam pojęcia, czym jest jTable, jednak to, czego szukasz, nazywa się selektorem dat, a jeśli wybierzesz go w Google jTable, otrzymasz kilka wyników, które mogą być tym, czego szukasz. Możesz znaleźć inne przydatne pytania tutaj http://stackoverflow.com/search?q=jTable+Date+Picker – hectorg87

+3

Powinieneś wskazać, z jakiego komponentu komponentu wizualnego korzystasz, ponieważ Java ma dużo, jeśli są one (kilka dla każdego środowiska). Na pulpicie można użyć: AWT, Swing, SWT na przykład. – helios

+2

@helios Przepraszam, nie mam dokładnie tego, co masz na myśli, "komponentu wizualnego komponentu". Muszę użyć tego w swing.jtable. Czy to odpowie na twoje pytanie? – Anubis

Odpowiedz

14

Znalazłem JXDatePicker jako lepsze rozwiązanie tego. Daje to, czego potrzebujesz i jest bardzo łatwy w użyciu.

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

Rzeczywisty link (?): Https://java.net/projects/swingx/downloads/directory/releases –

-1
  1. Otwórz dokument kodu źródłowego Java i przejdź do JTable zostały utworzone wewnątrz klasy Swing obiektu.

  2. Utwórz nowy obiekt TableModel z tabelą DatePickerTable. Musisz utworzyć DatePickerTable z zakresu dat w formacie MMDDYYYY. Pierwsza wartość to data rozpoczęcia, a ostatnia data końcowa. W kodzie wygląda to następująco:

    TableModel datePicker = new DatePickerTable("01011999","12302000"); 
    
  3. Ustaw interwał wyświetlania w obiekcie datePicker. Domyślnie wyświetlany jest każdy dzień, ale możesz ustawić regularny interwał. Aby ustawić interwał 15-dniową pomiędzy opcjami daty, użyj tego kodu:

    datePicker.interval = 15; 
    
  4. Attach model stołu do swojej JTable:

    JTable newtable = new JTable (datePicker); 
    

    Aplikacja Java ma teraz okno dialogowe wyboru data drop-down .

+1

Dzięki @ Sachin Mhetre. Ale to, co sugerujesz, nie działa. Nie ma takiej klasy jak DatePickerTable (Netbeans podkreśla to). Czy to rodzaj dodatku? – Anubis

9

Napisałem składnik 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

Dzięki za twój kod. To działa dobrze. Ale proszę o wypróbowanie mojego zaakceptowanego rozwiązania poniżej. Działa naprawdę dobrze. Zwykle akceptuję to jako odpowiedź, ponieważ pomoże to innym, którzy będą o tym w przyszłości szukać.Jeśli mogę przyjąć dwie odpowiedzi, to oczywiście przyjmuję również twoje, nie mogę przyjąć dwóch odpowiedzi. Mam nadzieję, że nie będziesz miał nic przeciwko. Dzięki za pomoc .. – Anubis

5

Biblioteka LGoodDatePicker zawiera (huśtawka) DatePicker komponent, który pozwala użytkownikowi na wybór daty z kalendarza. (Domyślnie użytkownicy mogą również wpisywać daty z klawiatury, ale wpis na klawiaturze może być wyłączony w razie potrzeby). DatePicker ma automatyczną walidację danych, co oznacza (między innymi), że każda data, którą wprowadzi użytkownik, będzie zawsze konwertowana na pożądany format daty.

Uczciwe ujawnienie: Jestem głównym programistą.

Ponieważ DatePicker jest elementem swing, można go dodać do dowolnego innego kontenera swing, w tym (w scenariuszu) komórki JTable.

Najczęściej używane formaty daty są obsługiwane automatycznie, a dodatkowe formaty daty można dodać w razie potrzeby.

Aby wymusić pożądany format daty, najprawdopodobniej chcesz ustawić wybrany format jako domyślny "format wyświetlania" dla elementu DatePicker. Formaty można określić za pomocą Java 8 DateTimeFormatter Patterns. Niezależnie od tego, co użytkownik wpisze (lub kliknie), data będzie zawsze konwertowana do określonego formatu, jak tylko użytkownik skończy.

Oprócz elementu DatePicker biblioteka ma również komponenty TimePicker i DateTimePicker. Wkleiłem zrzuty ekranu wszystkich składników (i programu demonstracyjnego) poniżej.

Bibliotekę można zainstalować w projekcie Java z projektu release page.

Strona główna projektu znajduje się na Github pod adresem:
https://github.com/LGoodDatePicker/LGoodDatePicker.


DateTimePicker screenshot


DateTimePicker examples


Demo screenshot

1

Inna prosta metoda w Netbeans jest dostarczony tutaj, Istnieją biblioteki wewnątrz samego Netbeans, gdzie rozwiązania dla tego typu sytuacje są dostępne. Wybierz odpowiedni również. Jest to znacznie łatwiejsze.Po wykonaniu presc zaznaczone kroki w linku, zrestartuj 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

Odpowiedzi tylko do łącza są mniej niż optymalne w przypadku przepełnienia stosu (zwarcie łącza i inne przyczyny) . Proszę napisać streszczenie połączonego artykułu, najlepiej z kluczowym kodem źródłowym i wyjaśnieniem. –

+0

Dziękuję za poprawienie mnie BasilBourque –

Powiązane problemy