2016-11-12 2 views
0

Используя приведенный ниже код, я попытался изменить и выбрать время и дату из JSpinner.Как выбрать время и дату в JSpinner?

На самом деле я могу просто изменить время, как оно отформатировано.

Должен ли я попытаться добавить отдельный JSpinner с помощью SpinnerDatamodel?

Есть ли возможность изменить дату тоже?

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerDateModel; 
import javax.swing.SpinnerModel; 
import java.util.Date; 
import javax.swing.Timer; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class SpinnerTest { 

Timer timer; 
public static void main(String args[]) { 
    new SpinnerTest().startApp(); 
} 

private void startApp() { 
JFrame frame = new JFrame("JSpinner Sample"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


SpinnerModel model1 = new SpinnerDateModel(); 
JSpinner spinner1 = new JSpinner(model1); 
spinner1.setEditor(new JSpinner.DateEditor(spinner1, "HH:mm:ss dd-MM-yyyy")); 
spinner1.addChangeListener(new CalendarListener()); 

JLabel label1 = new JLabel("Dates/Date"); 
JPanel panel1 = new JPanel(new BorderLayout()); 
panel1.add(label1, BorderLayout.WEST); 
panel1.add(spinner1, BorderLayout.CENTER); 
frame.add(panel1, BorderLayout.CENTER); 

frame.setSize(200, 90); 
frame.setVisible(true); 
} 


private class CalendarListener implements ChangeListener { 
    @Override 
    public void stateChanged(ChangeEvent e) { 
    JSpinner jSpinner = (JSpinner) e.getSource(); 
    Date date = (Date) jSpinner.getValue(); 
    long delay = date.getTime() - System.currentTimeMillis(); 
    timerStart(); 
    if (delay > 0) { 
    timer.setInitialDelay((int) delay); 
    timer.restart(); 
    } 
} 
} 

private void timerStart() { 
this.timer = new Timer(Integer.MAX_VALUE, (ActionEvent evt) -> { 
System.out.println("okey"); 
});} 

}

+1

Обычно интерфейс будет использовать два счетчики, один для даты и один для времени. – camickr

+0

Да, это работает, но как я могу реализовать его, чтобы выбрать все отдельные, такие как «HH», затем «mm», затем «ss» и т. Д., Если это сработает? Я попробовал, но триггер таймера не работает. Прежде, чем я смог изменить только «Час и День», он срабатывает. благодаря –

ответ

0

Наконец я мог позволить ей работать.

Ему нужно было то же самое значение даты только с одним JSpinner.

И для выбора значений необходимо нажать в середине номеров (Час, Минуты и т. Д.).

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerDateModel; 
import javax.swing.SpinnerModel; 
import java.util.Date; 
import javax.swing.Timer; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class SpinnerTest { 

Timer timer; 
Date date; 
public static void main(String args[]) { 
    new SpinnerTest().startApp(); 
} 

private void startApp() { 
JFrame frame = new JFrame("JSpinner Sample"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

date = new Date(); 
SpinnerModel model1 = new SpinnerDateModel(date,null,null,0); 
JSpinner spinner1 = new JSpinner(model1); 

spinner1.addChangeListener(new CalendarListener()); 
spinner1.setEditor(new JSpinner.DateEditor(spinner1, "HH:mm dd-MM-yyyy")); 

JLabel label1 = new JLabel("Times/Dates"); 
JPanel panel1 = new JPanel(new BorderLayout()); 
JPanel panel2 = new JPanel(new BorderLayout()); 

panel2.add(label1, BorderLayout.WEST); 
panel1.add(spinner1, BorderLayout.CENTER); 

frame.add(panel1, BorderLayout.CENTER); 
frame.add(panel2, BorderLayout.WEST); 


frame.setSize(200, 90); 
frame.setVisible(true); 
} 


private class CalendarListener implements ChangeListener { 
    @Override 
    public void stateChanged(ChangeEvent e) { 

JSpinner jSpinner = (JSpinner) e.getSource(); 
date = (Date) jSpinner.getValue() ; 


long delay = date.getTime() - System.currentTimeMillis(); 
//System.out.println(delay); 
    timerStart(); 
    if (delay > 0) { 
    timer.setInitialDelay((int) delay); 
    timer.restart(); 
} 
} 

}

private void timerStart() { 
    this.timer = new Timer(Integer.MAX_VALUE, (ActionEvent evt) -> { 
    System.out.println("okey"); 
});} 
} 
Смежные вопросы