带有SpinnerDateModel的JSpinner不会旋转

时间:2015-03-20 22:40:33

标签: java swing jspinner

我正在使用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);
旋转器效果很好。

这里有什么不对?

1 个答案:

答案 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());
    }
}