Re: JSpinner in hex



Roedy Green wrote:
I have written a HexFormat derived from java.text.Format that behaves
like a simplified DecimalFormat, however I don't see a simple way to
hook it up to a JSpinner to display values in hex. Is there a trick,
or must I write my own NumberEditor cloning a lot of code?

Here is what I have. I've decided not to build it on class Format, but
instead on JFormattedTextField's formatter.
Editing and stepping up/down seems to work. But stepping below zero (to
FFFFFFFF) doesn't.


import java.text.ParseException;
import javax.swing.*;
import javax.swing.text.DefaultFormatterFactory;

public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JSpinner spinner = new JSpinner(new SpinnerNumberModel());
spinner.setEditor(new HexNumberEditor(spinner));
frame.add(spinner);
frame.pack();
frame.setVisible(true);
}
}

class HexNumberEditor extends JSpinner.NumberEditor {
public HexNumberEditor(JSpinner spinner) {
super(spinner);
JFormattedTextField ftf = getTextField();
ftf.setEditable(true);
ftf.setFormatterFactory(new HexNumberFormatterFactory());
}
}

class HexNumberFormatterFactory extends DefaultFormatterFactory {
public HexNumberFormatterFactory() {
super(new HexNumberFormatter());
}
}

class HexNumberFormatter extends JFormattedTextField.AbstractFormatter {
/** Converts a hex-coded String to an Integer */
@Override
public Object stringToValue(String text) throws ParseException {
int n = Integer.parseInt(text, 16);
return new Integer(n);
}

/** Converts a Number to a hex-coded String (8 digits long) */
@Override
public String valueToString(Object value) throws ParseException {
Number number = (Number) value;
String s = Integer.toHexString(number.intValue());
while (s.length() < 8)
s = "0" + s;
return s;
}
}

--
Thomas



.