Я использую пару JSpinners в своем проекте, которые отображают часы и минуты. Когда JSpinner увеличивается или уменьшается, я должен сохранить значение в базе данных. Но проблема в том, что JSpinners дают мне старые значения. Например, если отображаемое время равно 09:30
, и я увеличиваю время до 10:30
, я получаю 09:30 в качестве возвращаемого значения. Я использую следующий код
ОБНОВЛЕНО SSCCE
package spinnerupdation;
import java.awt.Container;
import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.DateFormatter;
import javax.swing.text.DefaultFormatterFactory;
/**
*
* @author Rohan Kandwal
*/
public class SpinnerUpdation extends JFrame{
public JSpinner spinner;
SpinnerUpdation(){
Container pane=this.getContentPane();
JPanel panel=new JPanel();
panel.setLayout(new FlowLayout());
SpinnerDateModel model=new SpinnerDateModel();
model.setCalendarField(Calendar.HOUR);
spinner=new JSpinner();
spinner.setModel(model);
spinner.setEditor(new JSpinner.DateEditor(spinner,"hh:mm"));
panel.add(spinner);
pane.add(panel);
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JFormattedTextField tf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory();
DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter();
// Change the date format to only show the hours
formatter.setFormat(new SimpleDateFormat("hh:mm"));
//formatter.setCommitsOnValidEdit(true);
System.out.println(spinner.getValue());
//System.out.println(tf.getText());
}
});
}
public static void main(String[] args) {
SpinnerUpdation ss=new SpinnerUpdation();
ss.setDefaultCloseOperation(ss.EXIT_ON_CLOSE);
ss.setSize(574, 445);
//ss.pack();
ss.setLocationRelativeTo(null);
ss.setResizable(false);
ss.setVisible(true);
}
}
если я использую tf.getText()
, я получаю старое значение дважды, но если я использую spinner.getValue
, я получаю новое значение, но оно в длинном формате
Thu Jan 01 10:18:00 IST 1970
Thu Jan 01 11:18:00 IST 1970
Как мне отформатировать счетчик, чтобы он выдавал только 11:18
?
SimpleDateFormat
, похоже, он удаляет информацию о дате из возвращаемого значения... - person MadProgrammer   schedule 22.01.2013stringToValue
не имеет контекста, для которого можно установить часть даты объектаDate
, поэтому, когда он преобразует значение времени, часть даты сбрасывается обратно на 0 - person MadProgrammer   schedule 22.01.2013String
вDate
, он удаляет часть даты изDate
. Как это исправить, я совершенно не представляю. - person MadProgrammer   schedule 22.01.2013Date
отдельно, когда событие изменения запускается, вам нужно извлечь значения часа и минуты из значения из счетчика и объединить их со значением даты. Затем вам нужно будет определить, изменилось ли значение каким-либо образом, и предпринять необходимые действия. Другой вариант, который у вас есть, это поместить два счетчика на панель, один из которых представляет часы, а другой - минуты... - person MadProgrammer   schedule 22.01.2013