带有 SpinnerDateModel 的 JSpinner 不旋转
JSpinner with SpinnerDateModel not spinning
我正在开发 Java 应用程序,使用 Swing 创建 GUI。我的 JSpinner 有问题,它应该允许用户以 HH:mm 格式在特定范围内使用 select 时间。我创建了自定义 SpinnerDateModel 和 DateEditor,一切似乎都正常,但是当我 运行 应用程序微调器显示正确的值但不旋转时。
import java.util.Calendar;
import java.util.Date;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
public class SpinnerExample extends javax.swing.JFrame {
public static void main(String[] args) {
SpinnerExample main = new SpinnerExample();
main.setVisible(true);
}
/**
* Creates new form MainFrame
*/
public SpinnerExample() {
initComponents();
mySpinner.setModel(getMySpinnerModel());
mySpinner.setEditor(new JSpinner.DateEditor(mySpinner, "HH:mm"));
}
public SpinnerDateModel getMySpinnerModel() {
SpinnerDateModel spinnerModel = new SpinnerDateModel();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
Date selectedDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
Date endDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 1);
Date startDate = calendar.getTime();
spinnerModel = new SpinnerDateModel(selectedDate, startDate, endDate, Calendar.HOUR_OF_DAY);
return spinnerModel;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
mySpinner = new javax.swing.JSpinner();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(176, 176, 176)
.addComponent(mySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(195, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(106, 106, 106)
.addComponent(mySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(174, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JSpinner mySpinner;
// End of variables declaration
}
当我在创建 spinnerModel 时将空值作为 "start" 和 "end" 参数时,如下所示:
spinnerModel = new SpinnerDateModel(selectedDate, null, null, Calendar.HOUR_OF_DAY);
微调器效果很好。
这里有什么问题吗?
我遇到了同样的奇怪行为,但找不到合理的解释。但是,它可以使用下面的自定义编辑器 class。这是否解决了您的问题?
import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
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;
public class SpinnerExample extends JFrame {
private final JSpinner mySpinner;
public static void main(String[] args) {
SpinnerExample main = new SpinnerExample();
}
public SpinnerExample() {
super("SpinnerExample");
mySpinner = new JSpinner();
mySpinner.setModel(getMySpinnerModel());
// mySpinner.setEditor(new JSpinner.DateEditor(mySpinner, "HH:mm"));
mySpinner.setEditor(new CustomEditor(mySpinner, "HH:mm"));
add(mySpinner);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private SpinnerDateModel getMySpinnerModel() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date selectedDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
Date endDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 0);
Date startDate = calendar.getTime();
return new SpinnerDateModel(selectedDate, startDate,
endDate, Calendar.HOUR);
}
}
class CustomEditor extends JFormattedTextField implements ChangeListener {
private final JSpinner spinner;
public CustomEditor(JSpinner spinner, String pattern) {
super();
this.spinner = spinner;
DateFormatter formatter
= new DateFormatter(new SimpleDateFormat(pattern));
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
setFormatterFactory(new DefaultFormatterFactory(formatter));
updateValue();
spinner.addChangeListener(this);
addActionListener((ActionEvent e) -> {
this.spinner.getModel().setValue(this.getValue());
});
}
@Override
public void stateChanged(ChangeEvent e) {
updateValue();
}
private void updateValue() {
setValue((Date) spinner.getModel().getValue());
}
}
我正在开发 Java 应用程序,使用 Swing 创建 GUI。我的 JSpinner 有问题,它应该允许用户以 HH:mm 格式在特定范围内使用 select 时间。我创建了自定义 SpinnerDateModel 和 DateEditor,一切似乎都正常,但是当我 运行 应用程序微调器显示正确的值但不旋转时。
import java.util.Calendar;
import java.util.Date;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
public class SpinnerExample extends javax.swing.JFrame {
public static void main(String[] args) {
SpinnerExample main = new SpinnerExample();
main.setVisible(true);
}
/**
* Creates new form MainFrame
*/
public SpinnerExample() {
initComponents();
mySpinner.setModel(getMySpinnerModel());
mySpinner.setEditor(new JSpinner.DateEditor(mySpinner, "HH:mm"));
}
public SpinnerDateModel getMySpinnerModel() {
SpinnerDateModel spinnerModel = new SpinnerDateModel();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
Date selectedDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
Date endDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 1);
Date startDate = calendar.getTime();
spinnerModel = new SpinnerDateModel(selectedDate, startDate, endDate, Calendar.HOUR_OF_DAY);
return spinnerModel;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
mySpinner = new javax.swing.JSpinner();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(176, 176, 176)
.addComponent(mySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(195, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(106, 106, 106)
.addComponent(mySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(174, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JSpinner mySpinner;
// End of variables declaration
}
当我在创建 spinnerModel 时将空值作为 "start" 和 "end" 参数时,如下所示:
spinnerModel = new SpinnerDateModel(selectedDate, null, null, Calendar.HOUR_OF_DAY);
微调器效果很好。
这里有什么问题吗?
我遇到了同样的奇怪行为,但找不到合理的解释。但是,它可以使用下面的自定义编辑器 class。这是否解决了您的问题?
import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
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;
public class SpinnerExample extends JFrame {
private final JSpinner mySpinner;
public static void main(String[] args) {
SpinnerExample main = new SpinnerExample();
}
public SpinnerExample() {
super("SpinnerExample");
mySpinner = new JSpinner();
mySpinner.setModel(getMySpinnerModel());
// mySpinner.setEditor(new JSpinner.DateEditor(mySpinner, "HH:mm"));
mySpinner.setEditor(new CustomEditor(mySpinner, "HH:mm"));
add(mySpinner);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private SpinnerDateModel getMySpinnerModel() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date selectedDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
Date endDate = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 0);
Date startDate = calendar.getTime();
return new SpinnerDateModel(selectedDate, startDate,
endDate, Calendar.HOUR);
}
}
class CustomEditor extends JFormattedTextField implements ChangeListener {
private final JSpinner spinner;
public CustomEditor(JSpinner spinner, String pattern) {
super();
this.spinner = spinner;
DateFormatter formatter
= new DateFormatter(new SimpleDateFormat(pattern));
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
setFormatterFactory(new DefaultFormatterFactory(formatter));
updateValue();
spinner.addChangeListener(this);
addActionListener((ActionEvent e) -> {
this.spinner.getModel().setValue(this.getValue());
});
}
@Override
public void stateChanged(ChangeEvent e) {
updateValue();
}
private void updateValue() {
setValue((Date) spinner.getModel().getValue());
}
}