📄 numbertextfield.java
字号:
// TODO : enable toggle from insert to an overstrike text mode, enable an undo editor
package org.trinet.util.graphics.text;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import org.trinet.jdbc.datatypes.*;
import org.trinet.util.*;
import org.trinet.util.graphics.*;
// InputVerification kludges 1.2 for an InputVerifier set/get found in jdk 1.3
//public class NumberTextField extends JTextField implements InputVerification {
public class NumberTextField extends JTextField {
public static final int LONG_TYPE = 0 ;
public static final int INT_TYPE = 1 ;
public static final int FLOAT_TYPE = 2 ;
public static final int DOUBLE_TYPE = 4 ;
public static final int OBJECT_TYPE = 8 ;
protected int dataType;
protected DecimalFormat numberFormat;
protected String actionCommand = "";
protected boolean audioOn = true;
protected boolean informInvalidityOnFocusLost = false;
protected boolean transferFocusOnAction = false;
/*
protected static final int DEFAULT_COLUMNS = 12;
protected static final DecimalFormat DEFAULT_FORMAT = (DecimalFormat) NumberFormat.getNumberInstance();
static {
DEFAULT_FORMAT.setGroupingUsed(false);
DEFAULT_FORMAT.setDecimalSeparatorAlwaysShown(false);
DEFAULT_FORMAT.applyPattern("#0.###");
DEFAULT_FORMAT.setParseIntegerOnly(false);
}
*/
protected NumberTextField(Document document, int columns, DecimalFormat format) {
// super(document, "", columns); // attempts setText("") formatted as number, which fails setText verify
super(document, null, columns);
if (format == null) throw new NullPointerException("NumberTextField null format parameter");
numberFormat = format;
initField();
}
/*
public NumberTextField() {
this(new FormattedNumberDocument(DEFAULT_FORMAT, 0), DEFAULT_COLUMNS, DEFAULT_FORMAT);
}
public NumberTextField(int columns) {
this(new FormattedNumberDocument(DEFAULT_FORMAT, 0), columns, DEFAULT_FORMAT);
}
*/
public NumberTextField(int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
}
public NumberTextField(float value, int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
setValue(value);
}
public NumberTextField(double value, int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
setValue(value);
}
public NumberTextField(int value, int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
setValue(value);
}
public NumberTextField(long value, int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
setValue(value);
}
public NumberTextField(Object value, int columns, DecimalFormat format) {
this(new FormattedNumberDocument(format, 0), columns, format);
setValue(value);
}
protected void initField() {
addValidityListeners();
setInputVerifier(new NumberTextFieldVerifier());
}
/* Test key board input
protected void processKeyEvent(KeyEvent evt) {
System.out.println("evt.paramString: " + evt.paramString());
System.out.println("keyCode: " + evt.getKeyCode());
System.out.println("keyChar: " + evt.getKeyChar());
System.out.println("keyText: " + evt.getKeyText(evt.getKeyCode()));
if(evt.getID() == KeyEvent.KEY_PRESSED && evt.getKeyCode() == KeyEvent.VK_TAB) {
if (textChanged || ! validityValue) {
// textChanged = false;
}
if (! validityValue) {
// evt.consume();
}
}
super.processKeyEvent(evt);
}
*/
/*
* Overrides base class implementation for setting field text string.
* @throws InvalidInputException input text fails validation
*/
public void setText(String text) {
Number value = stringToNumber(text);
boolean valid = accepts(value);
if (valid) {
super.setText(text);
notifyValueChanged(value, valid);
}
else {
// notifyInputBoundsViolated(value);
throw new InvalidInputException("NumberTextField setText(String) invalid input parameter: " + value);
}
}
/*
* override base class implementation
*/
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
Insets insets = getInsets();
size.width += (insets.left + insets.right);
return size;
}
/*
* override base class implementation
*/
protected int getColumnWidth() {
return getFontMetrics(getFont()).charWidth('5');
}
public int getDataType() {
return dataType;
}
public Number stringToNumber(String text) {
Number retVal = null;
if (text.equals("")) return retVal;
try {
retVal = numberFormat.parse(text);
} catch (ParseException ex) { // should not happen: insertString properly formats field data
if (audioOn) Toolkit.getDefaultToolkit().beep();
System.err.println("NumberTextField.stringToNumber(String) : " + ex.toString());
}
return retVal;
}
/** Gets the number value equivalent of the input text.
* @throws InvalidInputException input text fails validation
*/
public Number getNumberValue() {
Number value = stringToNumber(getText());
if (! accepts(value))
throw new InvalidInputException("NumberTextField getNumberValue() input fails verification : " + value);
return value;
}
public Object getValue() {
// return getNumberValue();
return stringToNumber(getText());
}
public double getDoubleValue() {
double retVal = 0.0;
Number value = getNumberValue();
return (value == null) ? retVal : value.doubleValue();
}
public float getFloatValue() {
float retVal = 0.f;
Number value = getNumberValue();
return (value == null) ? retVal : value.floatValue();
}
public int getIntValue() {
int retVal = 0;
Number value = getNumberValue();
return (value == null) ? retVal : value.intValue();
}
public long getLongValue() {
long retVal = 0l;
Number value = getNumberValue();
return (value == null) ? retVal : value.longValue();
}
public void setValue(int value) {
dataType = INT_TYPE;
setText(numberFormat.format((long)value));
}
public void setValue(long value) {
dataType = LONG_TYPE;
setText(numberFormat.format(value));
}
public void setValue(float value) {
dataType = FLOAT_TYPE;
setText(numberFormat.format((double)value));
}
public void setValue(double value) {
dataType = DOUBLE_TYPE;
setText(numberFormat.format(value));
}
public void setValue(Object value) {
dataType = OBJECT_TYPE;
if (value == null) setText("");
else if (! (value instanceof DataObject)) setText(numberFormat.format(value));
else {
if (((DataObject) value).isNull()) setText("");
else if ( (value instanceof DataDouble) || (value instanceof DataFloat)) {
setText(numberFormat.format(((DataDouble) value).doubleValue()));
}
else setText(numberFormat.format(((DataObject) value).longValue()));
}
}
public String getActionCommand() {
return this.actionCommand;
}
public void setActionCommand(String command) {
this.actionCommand = command;
super.setActionCommand(command);
}
private boolean textChanged = true;
private boolean validityValue = false;
private Number numberValue;
private boolean nullAllowed = false;
private Number defaultValue = null;
private RangeLimits limits;
private ConstraintErrorActionStates limitsErrorActionStates;
private InputVerifier inputVerifier;
public void setConstraintErrorActionStates(boolean log, boolean audio, boolean reset, boolean popup) {
if (limitsErrorActionStates == null) {
limitsErrorActionStates = new ConstraintErrorActionStates(log, audio, reset, popup);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -