1. package org.jr.swing;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年2月12日
  6. * @author Cherami
  7. */
  8. import javax.swing.*;
  9. import javax.swing.text.*;
  10. import org.jr.swing.text.*;
  11. /**
  12. * 只能输入数字的Swing组件。
  13. * 可以设置可以输入的数字的最大值和最小值。
  14. * @since 0.1
  15. */
  16. public class JNumberTextField
  17. extends JTextField {
  18. private double max, min;
  19. private boolean isLimit = false;
  20. /**
  21. * 缺省构造方法,构造一个新的JNumberTextField。
  22. * @since 0.3
  23. */
  24. public JNumberTextField() {
  25. super();
  26. }
  27. /**
  28. * 根据指定的列数构造一个具有最佳宽度的新的JNumberTextField。
  29. * @param columns 初始的列数
  30. * @since 0.1
  31. */
  32. public JNumberTextField(int columns) {
  33. super(columns);
  34. }
  35. /**
  36. * 以指定的文本构造一个新的JNumberTextField。
  37. * @param text 初始显示文本
  38. * @since 0.3
  39. */
  40. public JNumberTextField(String text) {
  41. super(text);
  42. }
  43. /**
  44. * 以指定的文本和列数构造一个具有最佳宽度的新的JNumberTextField。
  45. * @param text 初始显示文本
  46. * @param columns 初始的列数
  47. * @since 0.3
  48. */
  49. public JNumberTextField(String text, int columns) {
  50. super(text, columns);
  51. }
  52. /**
  53. * 根据指定可以输入的最大值最小值构造一个具有最佳宽度的新的JNumberTextField。
  54. * 如果max小于min则可以输入的最大值和最小值的限制无效,作为没有大小限制的情况处理。
  55. * @param max 可以输入的最大值
  56. * @param min 可以输入的最小值
  57. * @since 0.3
  58. */
  59. public JNumberTextField(double max, double min) {
  60. if (max >= min) {
  61. this.max = max;
  62. this.min = min;
  63. isLimit = true;
  64. }
  65. }
  66. /**
  67. * 根据指定的文本和可以输入的最大值最小值构造一个具有最佳宽度的新的JNumberTextField。
  68. * 如果max小于min则可以输入的最大值和最小值的限制无效,作为没有大小限制的情况处理。
  69. * @param text 初始的文本
  70. * @param max 可以输入的最大值
  71. * @param min 可以输入的最小值
  72. * @since 0.3
  73. */
  74. public JNumberTextField(String text, double max, double min) {
  75. super(text);
  76. if (max >= min) {
  77. this.max = max;
  78. this.min = min;
  79. isLimit = true;
  80. }
  81. }
  82. /**
  83. * 根据指定的列数和可以输入的最大值最小值构造一个具有最佳宽度的新的JNumberTextField。
  84. * 如果max小于min则可以输入的最大值和最小值的限制无效,作为没有大小限制的情况处理。
  85. * @param columns 初始的列数
  86. * @param max 可以输入的最大值
  87. * @param min 可以输入的最小值
  88. * @since 0.1
  89. */
  90. public JNumberTextField(int columns, double max, double min) {
  91. super(columns);
  92. if (max >= min) {
  93. this.max = max;
  94. this.min = min;
  95. isLimit = true;
  96. }
  97. }
  98. /**
  99. * 根据指定的文本和初始列数以及可以输入的最大值最小值构造一个具有最佳宽度的新的JNumberTextField。
  100. * 如果max小于min则可以输入的最大值和最小值的限制无效,作为没有大小限制的情况处理。
  101. * @param text 初始的文本
  102. * @param columns 初始的列数
  103. * @param max 可以输入的最大值
  104. * @param min 可以输入的最小值
  105. * @since 0.3
  106. */
  107. public JNumberTextField(String text, int columns, double max, double min) {
  108. super(text, columns);
  109. if (max >= min) {
  110. this.max = max;
  111. this.min = min;
  112. isLimit = true;
  113. }
  114. }
  115. /**
  116. * 设置可以输入的值的范围。
  117. * 如果max小于min则可以输入的最大值和最小值的限制无效,作为没有大小限制的情况处理。
  118. * @param max 可以输入的最大值
  119. * @param min 可以输入的最小值
  120. * @since 0.1
  121. */
  122. public void setRange(double max, double min) {
  123. if (max >= min) {
  124. this.max = max;
  125. this.min = min;
  126. isLimit = true;
  127. ( (NumberOnlyDocument) getDocument()).setRange(max, min);
  128. }
  129. }
  130. /**
  131. * 设置是否限制输入数字的大小。
  132. * 如果参数是true时只有在原来的最大值大于最小值是这个设置才起效,否则此方法调用没有任何效果。
  133. * 如果参数值是false则取消输入数字大小的限制
  134. * @param isLimit 是否限制输入数字的大小
  135. * @since 0.3
  136. */
  137. public void setLimit(boolean isLimit) {
  138. if (isLimit == true && max >= min) {
  139. this.isLimit = isLimit;
  140. ( (NumberOnlyDocument) getDocument()).setRange(max, min);
  141. }
  142. else if (isLimit == false) {
  143. ( (NumberOnlyDocument) getDocument()).setLimit(isLimit);
  144. }
  145. }
  146. /**
  147. * 组件是否限制输入数字的大小。
  148. * @return 限制输入大小时返回true,否则返回false。
  149. * @since 0.3
  150. */
  151. public boolean isLimit() {
  152. return isLimit;
  153. }
  154. /**
  155. * 返回限制输入的最大值。
  156. * @return 限制输入的最大值。如果是不限制输入则返回Double.MIN_VALUE。
  157. * @since 0.3
  158. */
  159. public double getLimitedMax() {
  160. if (!isLimit) {
  161. return Double.MIN_VALUE;
  162. }
  163. else {
  164. return max;
  165. }
  166. }
  167. /**
  168. * 返回限制输入的最小值。
  169. * @return 限制输入的最小值。如果是不限制输入则返回Double.MAX_VALUE。
  170. * @since 0.3
  171. */
  172. public double getLimitedMin() {
  173. if (!isLimit) {
  174. return Double.MAX_VALUE;
  175. }
  176. else {
  177. return min;
  178. }
  179. }
  180. /**
  181. * 创建缺省的文档模型。
  182. * @return 只能输入数字相关的内容的文档模型
  183. * @since 0.1
  184. */
  185. protected Document createDefaultModel() {
  186. return new NumberOnlyDocument(max, min, isLimit);
  187. }
  188. }