我正在使用Swing开发Java应用程序以创建GUI。我有一个JSpinner的问题,应该允许用户从特定范围选择HH:mm格式的时间。我创建了自定义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时将nulls作为“start”和“end”参数放置如下:
spinnerModel = new SpinnerDateModel(selectedDate, null, null, Calendar.HOUR_OF_DAY);
旋转器效果很好。
这里有什么不对?
答案 0 :(得分:1)
我得到了同样奇怪的行为,我无法找到合理的解释。但是,它使用下面的自定义编辑器类。这会解决您的问题吗?
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());
}
}