diff --git a/designer_base/src/com/fr/design/gui/ispinner/UISpinner.java b/designer_base/src/com/fr/design/gui/ispinner/UISpinner.java index d2b85be2c..4e83b3e9e 100644 --- a/designer_base/src/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer_base/src/com/fr/design/gui/ispinner/UISpinner.java @@ -1,17 +1,5 @@ package com.fr.design.gui.ispinner; -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.RoundRectangle2D; - -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.JTextComponent; - import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; @@ -21,183 +9,196 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itextfield.UITextFieldUI; -import com.fr.stable.Constants; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.JTextComponent; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.RoundRectangle2D; public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver { - protected double value; - private static final int SIZE = 20; - private static final int LEN = 13; - private UINumberField textField; - private UIButton preButton; - private UIButton nextButton; - private double minValue; - private double maxValue; - private double dierta; - private String spinnerName = ""; - private UIObserverListener uiObserverListener; - private GlobalNameListener globalNameListener = null; - - - public UISpinner(double minValue, double maxValue, double dierta) { - this.minValue = minValue; - this.maxValue = maxValue; - this.dierta = dierta; - initComponents(); - iniListener(); - } - - public UISpinner(double minValue, double maxValue, double dierta, double defaultValue) { - this(minValue, maxValue, dierta); - textField.setValue(defaultValue); - } - - private void iniListener() { - if (shouldResponseChangeListener()) { - this.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (uiObserverListener == null) { - return; - } - uiObserverListener.doChange(); - } - }); - } - } - - /** - * 给组件分别加上FocusListener - * @param focusListener 监听事件 - */ - public void addUISpinnerFocusListenner(FocusListener focusListener) { - this.addFocusListener(focusListener); - this.textField.addFocusListener(focusListener); - this.preButton.addFocusListener(focusListener); - this.nextButton.addFocusListener(focusListener); - - } - - public double getValue() { - return value; - } - - public void setGlobalName(String name) { - spinnerName = name; - } - - public UINumberField getTextField() { - return textField; - } - - public void setValue(double value) { - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(spinnerName); - } - value = value < minValue ? minValue : value; - value = value > maxValue ? maxValue : value; - if (value == this.value) { - return; - } - this.value = value; - - textField.getDocument().removeDocumentListener(docListener); - textField.setValue(value); - textField.getDocument().addDocumentListener(docListener); - fireStateChanged(); - } - - public void setTextFieldValue(double value) { - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(spinnerName); - } - value = value < minValue ? minValue : value; - value = value > maxValue ? maxValue : value; - - if (value == this.value) { - return; - } - this.value = value; - fireStateChanged(); - } - - - public void setEnabled(boolean flag) { - super.setEnabled(flag); - this.textField.setEnabled(flag); - this.preButton.setEnabled(flag); - this.nextButton.setEnabled(flag); - } - - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = SIZE; - return dim; - } - - /** - *增加 a ChangeListener to the listener list. - * @param l 监听事件 - */ - public void addChangeListener(ChangeListener l) { - this.listenerList.add(ChangeListener.class, l); - } - - /** - *移除 a ChangeListener from the listener list. - * @param l 监听事件 - */ - public void removeChangeListener(ChangeListener l) { - this.listenerList.remove(ChangeListener.class, l); - } - - // august: Process the listeners last to first - protected void fireStateChanged() { - Object[] listeners = listenerList.getListenerList(); - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ChangeListener.class) { - ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); - } - } - } - - - private void initComponents() { - textField = initNumberField(); - textField.setMaxValue(maxValue); - textField.setMinValue(minValue); - setValue(value); - textField.setUI(new SpinnerTextFieldUI(textField)); - preButton = new UIButton(UIConstants.ARROW_UP_ICON){ + protected double value; + private static final int SIZE = 20; + private static final int LEN = 13; + private UINumberField textField; + private UIButton preButton; + private UIButton nextButton; + private double minValue; + private double maxValue; + private double dierta; + private String spinnerName = ""; + private UIObserverListener uiObserverListener; + private GlobalNameListener globalNameListener = null; + + + public UISpinner(double minValue, double maxValue, double dierta) { + this.minValue = minValue; + this.maxValue = maxValue; + this.dierta = dierta; + initComponents(); + iniListener(); + } + + public UISpinner(double minValue, double maxValue, double dierta, double defaultValue) { + this(minValue, maxValue, dierta); + textField.setValue(defaultValue); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + /** + * 给组件分别加上FocusListener + * + * @param focusListener 监听事件 + */ + public void addUISpinnerFocusListenner(FocusListener focusListener) { + this.addFocusListener(focusListener); + this.textField.addFocusListener(focusListener); + this.preButton.addFocusListener(focusListener); + this.nextButton.addFocusListener(focusListener); + + } + + public double getValue() { + return value; + } + + public void setGlobalName(String name) { + spinnerName = name; + } + + public UINumberField getTextField() { + return textField; + } + + public void setValue(double value) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(spinnerName); + } + value = value < minValue ? minValue : value; + value = value > maxValue ? maxValue : value; + if (value == this.value) { + return; + } + this.value = value; + + textField.getDocument().removeDocumentListener(docListener); + textField.setValue(value); + textField.getDocument().addDocumentListener(docListener); + fireStateChanged(); + } + + public void setTextFieldValue(double value) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(spinnerName); + } + value = value < minValue ? minValue : value; + value = value > maxValue ? maxValue : value; + + if (value == this.value) { + return; + } + this.value = value; + fireStateChanged(); + } + + + public void setEnabled(boolean flag) { + super.setEnabled(flag); + this.textField.setEnabled(flag); + this.preButton.setEnabled(flag); + this.nextButton.setEnabled(flag); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = SIZE; + return dim; + } + + /** + * 增加 a ChangeListener to the listener list. + * + * @param l 监听事件 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * 移除 a ChangeListener from the listener list. + * + * @param l 监听事件 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireStateChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + + private void initComponents() { + textField = initNumberField(); + textField.setMaxValue(maxValue); + textField.setMinValue(minValue); + setValue(value); + textField.setUI(new SpinnerTextFieldUI(textField)); + preButton = new UIButton(UIConstants.ARROW_UP_ICON) { public boolean shouldResponseChangeListener() { return false; } }; - preButton.setRoundBorder(true, Constants.LEFT); - nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { + preButton.setRoundBorder(true, Constants.LEFT); + nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { public boolean shouldResponseChangeListener() { return false; } }; - nextButton.setRoundBorder(true, Constants.LEFT); - setLayout(new BorderLayout()); - add(textField, BorderLayout.CENTER); - JPanel arrowPane = new JPanel(); - arrowPane.setPreferredSize(new Dimension(LEN, SIZE)); - arrowPane.setLayout(new GridLayout(2, 1)); - preButton.setBounds(0, 1, 13, 10); - nextButton.setBounds(0, 10, 13, 10); - arrowPane.add(preButton); - arrowPane.add(nextButton); - add(arrowPane, BorderLayout.EAST); + nextButton.setRoundBorder(true, Constants.LEFT); + setLayout(new BorderLayout()); + add(textField, BorderLayout.CENTER); + JPanel arrowPane = new JPanel(); + arrowPane.setPreferredSize(new Dimension(LEN, SIZE)); + arrowPane.setLayout(new GridLayout(2, 1)); + preButton.setBounds(0, 1, 13, 10); + nextButton.setBounds(0, 10, 13, 10); + arrowPane.add(preButton); + arrowPane.add(nextButton); + add(arrowPane, BorderLayout.EAST); componentInitListeners(); - } + } - private void componentInitListeners(){ + private void componentInitListeners() { preButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -219,7 +220,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver } } }); - textField.getDocument().removeDocumentListener(docListener); + textField.getDocument().removeDocumentListener(docListener); textField.getDocument().addDocumentListener(docListener); textField.addFocusListener(new FocusAdapter() { @Override @@ -229,123 +230,125 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver }); } - protected UINumberField initNumberField() { - return new UINumberField(2) { - public boolean shouldResponseChangeListener() { - return false; - } - }; - } - - private DocumentListener docListener = new DocumentListener() { - @Override - public void removeUpdate(DocumentEvent e) { - setTextFieldValue(textField.getValue()); - } - - @Override - public void insertUpdate(DocumentEvent e) { - setTextFieldValue(textField.getValue()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - setTextFieldValue(textField.getValue()); - } - }; - - /** - * 给组件登记一个观察者监听事件 - * @param listener 观察者监听事件 - */ - public void registerChangeListener(UIObserverListener listener) { - uiObserverListener = listener; - } + protected UINumberField initNumberField() { + return new UINumberField(2) { + public boolean shouldResponseChangeListener() { + return false; + } + }; + } + + private DocumentListener docListener = new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + + @Override + public void insertUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + + @Override + public void changedUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + }; + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } /** * 组件是否需要响应添加的观察者事件 * * @return 如果需要响应观察者事件则返回true,否则返回false */ - public boolean shouldResponseChangeListener() { - return true; - } + public boolean shouldResponseChangeListener() { + return true; + } /** * 给组件登记一个全局名字观察者监听事件 * * @param listener 观察者监听事件 */ - public void registerNameListener(GlobalNameListener listener) { - globalNameListener = listener; - } + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } /** * 组件是否需要响应添加的观察者事件 * * @return 如果需要响应观察者事件则返回true,否则返回false */ - public boolean shouldResponseNameListener() { - return true; - } - - private class SpinnerTextFieldUI extends UITextFieldUI { - - public SpinnerTextFieldUI(UITextField textField) { - super(textField); - } - - @Override - public void paintBorder(Graphics2D g2d, int width, int height, - boolean isRound, int rectDirection) { - // do nothing - } - - protected void paintBackground(Graphics g) { - JTextComponent editor = getComponent(); - int width = editor.getWidth(); - int height = editor.getHeight(); - Shape oldClip = g.getClip(); - Shape roundShape = new RoundRectangle2D.Double(0, 0, width, height, UIConstants.ARC, UIConstants.ARC); - Graphics2D g2d = (Graphics2D) g; - g2d.clearRect(0, 0, width, height); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.clip(roundShape); - g2d.setColor(Color.WHITE); - g2d.fillRoundRect(1, 1, width - 2, height - 2, UIConstants.ARC, UIConstants.ARC); - if (isRollOver && isEnabled()) { - Shape shape = new RoundRectangle2D.Double(1, 1, width - 3, height - 3, UIConstants.ARC, UIConstants.ARC); - GUIPaintUtils.paintBorderShadow(g2d, 3, shape, UIConstants.HOVER_BLUE, Color.WHITE); - } else { - g2d.setColor(UIConstants.LINE_COLOR); - g2d.drawRoundRect(1, 1, width - 2, height - 2, UIConstants.ARC, UIConstants.ARC); - g2d.clearRect(width - 2, 0, 2, height); - g2d.setClip(oldClip); - g2d.drawLine(width - 2, 1, width, 1); - g2d.drawLine(width - 2, height - 1, width, height - 1); - } - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - } - - } + public boolean shouldResponseNameListener() { + return true; + } + + private class SpinnerTextFieldUI extends UITextFieldUI { + + public SpinnerTextFieldUI(UITextField textField) { + super(textField); + } + + @Override + public void paintBorder(Graphics2D g2d, int width, int height, + boolean isRound, int rectDirection) { + // do nothing + } + + protected void paintBackground(Graphics g) { + JTextComponent editor = getComponent(); + int width = editor.getWidth(); + int height = editor.getHeight(); + Shape oldClip = g.getClip(); + Shape roundShape = new RoundRectangle2D.Double(0, 0, width, height, UIConstants.ARC, UIConstants.ARC); + Graphics2D g2d = (Graphics2D) g; + g2d.clearRect(0, 0, width, height); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.clip(roundShape); + g2d.setColor(Color.WHITE); + g2d.fillRoundRect(1, 1, width - 2, height - 2, UIConstants.ARC, UIConstants.ARC); + if (isRollOver && isEnabled()) { + Shape shape = new RoundRectangle2D.Double(1, 1, width - 3, height - 3, UIConstants.ARC, UIConstants.ARC); + GUIPaintUtils.paintBorderShadow(g2d, 3, shape, UIConstants.HOVER_BLUE, Color.WHITE); + } else { + g2d.setColor(UIConstants.LINE_COLOR); + g2d.drawRoundRect(1, 1, width - 2, height - 2, UIConstants.ARC, UIConstants.ARC); + g2d.clearRect(width - 2, 0, 2, height); + g2d.setClip(oldClip); + g2d.drawLine(width - 2, 1, width, 1); + g2d.drawLine(width - 2, height - 1, width, height - 1); + } + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + } + + } /** - * 程序入口 测试 - * @param args 参数 + * 程序入口 测试 + * + * @param args 参数 */ - public static void main(String... args) { - LayoutManager layoutManager = null; - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(layoutManager); - - UISpinner bb = new UISpinner(0, 9, 1); - bb.setValue(4); - bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); - content.add(bb); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } + public static void main(String... args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + + UISpinner bb = new UISpinner(0, 9, 1); + bb.setValue(4); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itextfield/UINumberField.java b/designer_base/src/com/fr/design/gui/itextfield/UINumberField.java index 439e98d56..e0f571042 100644 --- a/designer_base/src/com/fr/design/gui/itextfield/UINumberField.java +++ b/designer_base/src/com/fr/design/gui/itextfield/UINumberField.java @@ -16,92 +16,92 @@ import java.awt.*; * Number Field. */ public class UINumberField extends UITextField { - public static final double ERROR_VALUE = Double.MAX_VALUE + 4.44; // peter:错误的值. - /** - * 整数部分的长度 - */ - private int maxIntegerLength = 24; - /** - * 小数部分的长度 - */ + public static final double ERROR_VALUE = Double.MAX_VALUE + 4.44; // peter:错误的值. + /** + * 整数部分的长度 + */ + private int maxIntegerLength = 24; + /** + * 小数部分的长度 + */ private static final int DEFAULTMAXDECIMALLENTH = 16; - private static final int TESTMAXVALUE = 100; - private static final int TESTMINVALUE = -10; - private int maxDecimalLength = 16; - private double minValue = -Double.MAX_VALUE; - private double maxValue = Double.MAX_VALUE; - - private boolean isContentChanged = false; - - public UINumberField() { - this(32, 16); - } - - public UINumberField(int columns) { - this(); - setColumns(columns); - } - - public UINumberField(int maxIntegerLength, int maxDecimalLength) { - this(maxIntegerLength, maxDecimalLength, -Double.MAX_VALUE, Double.MAX_VALUE); - } - - public UINumberField(int maxIntegerLength, int maxDecimalLength, double minValue, double maxValue) { - this.maxIntegerLength = maxIntegerLength; - this.maxDecimalLength = maxDecimalLength; - this.minValue = minValue; - this.maxValue = maxValue; - setFieldDocument(); - } - - public void setFieldDocument(){ + private static final int TESTMAXVALUE = 100; + private static final int TESTMINVALUE = -10; + private int maxDecimalLength = 16; + private double minValue = -Double.MAX_VALUE; + private double maxValue = Double.MAX_VALUE; + + private boolean isContentChanged = false; + + public UINumberField() { + this(32, 16); + } + + public UINumberField(int columns) { + this(); + setColumns(columns); + } + + public UINumberField(int maxIntegerLength, int maxDecimalLength) { + this(maxIntegerLength, maxDecimalLength, -Double.MAX_VALUE, Double.MAX_VALUE); + } + + public UINumberField(int maxIntegerLength, int maxDecimalLength, double minValue, double maxValue) { + this.maxIntegerLength = maxIntegerLength; + this.maxDecimalLength = maxDecimalLength; + this.minValue = minValue; + this.maxValue = maxValue; + setFieldDocument(); + } + + public void setFieldDocument() { setDocument(new NumberDocument()); initListener(); } - public int getMaxIntegerLength() { - return maxIntegerLength; - } - - public void setMaxIntegerLength(int maxIntegerLength) { - this.maxIntegerLength = maxIntegerLength; - } - - public int getMaxDecimalLength() { - return maxDecimalLength; - } - - public void setMaxDecimalLength(int maxDecimalLength) { - this.maxDecimalLength = maxDecimalLength; - } - - public double getMinValue() { - return minValue; - } - - public void setMinValue(double minValue) { - this.minValue = minValue; - } - - public double getMaxValue() { - return maxValue; - } - - public void setMaxValue(double maxValue) { - this.maxValue = maxValue; - } - - /** - * Set the value. - */ - public void setValue(double value) { - this.setText(Utils.doubleToString(value)); - } - - /** - * Return the value. - */ - public double getValue() throws NumberFormatException { + public int getMaxIntegerLength() { + return maxIntegerLength; + } + + public void setMaxIntegerLength(int maxIntegerLength) { + this.maxIntegerLength = maxIntegerLength; + } + + public int getMaxDecimalLength() { + return maxDecimalLength; + } + + public void setMaxDecimalLength(int maxDecimalLength) { + this.maxDecimalLength = maxDecimalLength; + } + + public double getMinValue() { + return minValue; + } + + public void setMinValue(double minValue) { + this.minValue = minValue; + } + + public double getMaxValue() { + return maxValue; + } + + public void setMaxValue(double maxValue) { + this.maxValue = maxValue; + } + + /** + * Set the value. + */ + public void setValue(double value) { + this.setText(Utils.doubleToString(value)); + } + + /** + * Return the value. + */ + public double getValue() throws NumberFormatException { try { if (this.getText().length() == 0) { return 0; @@ -113,134 +113,134 @@ public class UINumberField extends UITextField { } } - /** - * Retusn text value. - */ - public String getTextValue() { - return this.getText(); - } - - /** - * Set property integer. - * - * @param integer - * New value of property integer. - */ - public void setInteger(boolean integer) { - if (integer) { - this.maxDecimalLength = 0; - } else { - this.maxDecimalLength = DEFAULTMAXDECIMALLENTH; - } - } - - /** - * Check whether the content changed. - */ - public boolean isContentChanged() { - return isContentChanged; - } - - public void setisContentChanged(boolean isContentChanged){ + /** + * Retusn text value. + */ + public String getTextValue() { + return this.getText(); + } + + /** + * Set property integer. + * + * @param integer New value of property integer. + */ + public void setInteger(boolean integer) { + if (integer) { + this.maxDecimalLength = 0; + } else { + this.maxDecimalLength = DEFAULTMAXDECIMALLENTH; + } + } + + /** + * Check whether the content changed. + */ + public boolean isContentChanged() { + return isContentChanged; + } + + public void setisContentChanged(boolean isContentChanged) { this.isContentChanged = isContentChanged; } - - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 20); - } - class NumberDocument extends PlainDocument { - public NumberDocument() { - } + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 20); + } + + class NumberDocument extends PlainDocument { + public NumberDocument() { + } + public boolean checkString(int offset, String s, String str) { - return (ComparatorUtils.equals(s,"F") - || ComparatorUtils.equals(s,"f") - || ComparatorUtils.equals(s,"D") - || ComparatorUtils.equals(s,"d") - ||(ComparatorUtils.equals(str.trim(),"0") && !ComparatorUtils.equals(s.substring(0, 1),".") && offset != 0)// 第一位是0时,第二位只能为小数点 - ||(ComparatorUtils.equals(s,".") && maxDecimalLength == 0)); + return (ComparatorUtils.equals(s, "F") + || ComparatorUtils.equals(s, "f") + || ComparatorUtils.equals(s, "D") + || ComparatorUtils.equals(s, "d") + || (ComparatorUtils.equals(str.trim(), "0") && !ComparatorUtils.equals(s.substring(0, 1), ".") && offset != 0)// 第一位是0时,第二位只能为小数点 + || (ComparatorUtils.equals(s, ".") && maxDecimalLength == 0)); } - - public void insertString(int offset, String s, AttributeSet a) throws BadLocationException { - String str = getText(0, getLength()); - - // 不能为f,F,d,D - if (checkString(offset,s, str) ) { - Toolkit.getDefaultToolkit().beep(); - return; - } - - String strNew = str.substring(0, offset) + s + str.substring(offset, getLength()); - if(notChange(strNew)) { - return; - } - setisContentChanged(true); - super.insertString(offset, s, a); - } - - // kunsnat: 这种限制输入 有个不好的地方, 比如删除时: 10.1 最大值限定100, 那么就删除中间的小数点之后变为101, 超出了100. - // 但是直接限制不能删除中间类似小数点, 那么也可能遇到: 最小值10 , 从100变化到其中的19, 就很难.. - private boolean notChange(String strNew) { - boolean noChange = false; - strNew = strNew.replaceFirst("-", StringUtils.EMPTY); // 控制能输入负数 - boolean isMinus = strNew.startsWith("-"); - String strIntPart; - String strDecPart = StringUtils.EMPTY; - int decPos = strNew.indexOf(CoreConstants.DOT); - if (decPos > -1) { - strIntPart = strNew.substring(0, decPos); - strDecPart = strNew.substring(decPos + 1); - } else { - strIntPart = strNew; - } - if (isOverMaxOrMinValue(strIntPart, strDecPart, strNew)) { - Toolkit.getDefaultToolkit().beep(); - noChange = true; - } - - try { - if (!ComparatorUtils.equals(strNew, StringUtils.EMPTY) && !ComparatorUtils.equals(strNew, "-")) {// 控制能输入负数 - double d = Double.parseDouble(strNew) * (isMinus ? -1 : 1); - if (d < minValue || d > maxValue) { - throw new Exception(); - } - } - } catch (Exception e) { - Toolkit.getDefaultToolkit().beep(); - noChange = true; - } - - return noChange; - } - - private boolean isOverMaxOrMinValue(String strIntPart, String strDecPart, String strNew) { - return strIntPart.length() > maxIntegerLength - || strDecPart.length() > maxDecimalLength - || (strNew.length() > 1 && ComparatorUtils.equals(strNew.substring(0, 1), "0") && !ComparatorUtils.equals(strNew.substring(1, 2),".")); - } - } + + public void insertString(int offset, String s, AttributeSet a) throws BadLocationException { + String str = getText(0, getLength()); + + // 不能为f,F,d,D + if (checkString(offset, s, str)) { + Toolkit.getDefaultToolkit().beep(); + return; + } + + String strNew = str.substring(0, offset) + s + str.substring(offset, getLength()); + if (notChange(strNew)) { + return; + } + setisContentChanged(true); + super.insertString(offset, s, a); + } + + // kunsnat: 这种限制输入 有个不好的地方, 比如删除时: 10.1 最大值限定100, 那么就删除中间的小数点之后变为101, 超出了100. + // 但是直接限制不能删除中间类似小数点, 那么也可能遇到: 最小值10 , 从100变化到其中的19, 就很难.. + private boolean notChange(String strNew) { + boolean noChange = false; + strNew = strNew.replaceFirst("-", StringUtils.EMPTY); // 控制能输入负数 + boolean isMinus = strNew.startsWith("-"); + String strIntPart; + String strDecPart = StringUtils.EMPTY; + int decPos = strNew.indexOf(CoreConstants.DOT); + if (decPos > -1) { + strIntPart = strNew.substring(0, decPos); + strDecPart = strNew.substring(decPos + 1); + } else { + strIntPart = strNew; + } + if (isOverMaxOrMinValue(strIntPart, strDecPart, strNew)) { + Toolkit.getDefaultToolkit().beep(); + noChange = true; + } + + try { + if (!ComparatorUtils.equals(strNew, StringUtils.EMPTY) && !ComparatorUtils.equals(strNew, "-")) {// 控制能输入负数 + double d = Double.parseDouble(strNew) * (isMinus ? -1 : 1); + if (d < minValue || d > maxValue) { + throw new Exception(); + } + } + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + noChange = true; + } + + return noChange; + } + + private boolean isOverMaxOrMinValue(String strIntPart, String strDecPart, String strNew) { + return strIntPart.length() > maxIntegerLength + || strDecPart.length() > maxDecimalLength + || (strNew.length() > 1 && ComparatorUtils.equals(strNew.substring(0, 1), "0") && !ComparatorUtils.equals(strNew.substring(1, 2), ".")); + } + } /** * 测试程序 */ - public static void main(String[] args) { - JFrame frame = new JFrame(""); - frame.setSize(400, 320); - Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); - UINumberField tt = new UINumberField(); - tt.setMinValue(0.0); - tt.setMaxValue(100.0); - frame.getContentPane().setLayout(new GridLayout(10, 2)); - frame.getContentPane().add(new UILabel("New JNumberField()")); - frame.getContentPane().add(tt); - frame.getContentPane().add(new UILabel("New JNumberField(2)")); - frame.getContentPane().add(new UILabel("New JNumberField(8,2)")); - frame.getContentPane().add(new UINumberField(8, 2)); - frame.getContentPane().add(new UILabel("New JNumberField(5,2,-10,100)")); - frame.getContentPane().add(new UINumberField(5, 2, TESTMINVALUE, TESTMAXVALUE)); - frame.setVisible(true); - } + public static void main(String[] args) { + JFrame frame = new JFrame(""); + frame.setSize(400, 320); + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); + UINumberField tt = new UINumberField(); + tt.setMinValue(0.0); + tt.setMaxValue(100.0); + frame.getContentPane().setLayout(new GridLayout(10, 2)); + frame.getContentPane().add(new UILabel("New JNumberField()")); + frame.getContentPane().add(tt); + frame.getContentPane().add(new UILabel("New JNumberField(2)")); + frame.getContentPane().add(new UILabel("New JNumberField(8,2)")); + frame.getContentPane().add(new UINumberField(8, 2)); + frame.getContentPane().add(new UILabel("New JNumberField(5,2,-10,100)")); + frame.getContentPane().add(new UINumberField(5, 2, TESTMINVALUE, TESTMAXVALUE)); + frame.setVisible(true); + } } \ No newline at end of file