如何在spinner中显示十六进制的数?是要自己去写editor么?

解决方案 »

  1.   

    自己顶一下先!难道就没有什么办法么?JFormattedTextField能有这种功能么?
      

  2.   

    import java.awt.BorderLayout;
    import java.text.ParseException;import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerNumberModel;
    import javax.swing.text.DefaultFormatterFactory;public class T {
    public static void main(String[] args) {
    JSpinner spinner = new JSpinner(new SpinnerNumberModel(50, 0, 100, 1));
    final JFormattedTextField.AbstractFormatter formatter = new JFormattedTextField.AbstractFormatter() {
    public Object stringToValue(String text) throws ParseException {
    if (text != null && text.startsWith("0x")) {
    text = text.substring(2);
    }
    return new Integer(Integer.parseInt(text, 16));
    } public String valueToString(Object value) throws ParseException {
    int v = ((Number)value).intValue();
    return "0x" + Integer.toHexString(v).toUpperCase();
    }
    };

    class HexNumberEditor extends JSpinner.DefaultEditor {
    public HexNumberEditor(JSpinner spinner) {
    super(spinner);

        if (!(spinner.getModel() instanceof SpinnerNumberModel)) {
    throw new IllegalArgumentException("model not a SpinnerNumberModel");
        }
        getTextField().setEditable(true);
        getTextField().setFormatterFactory(new DefaultFormatterFactory(formatter));
    }
    }

    spinner.setEditor(new HexNumberEditor(spinner));

    JFrame f = new JFrame();
    f.getContentPane().add(spinner, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }