3 // This file is part of PosterDivider.
5 package jp.sourceforge.posterdivider;
7 import java.awt.TextField;
8 import java.awt.event.ActionEvent;
9 import java.awt.event.ActionListener;
10 import java.awt.event.FocusEvent;
11 import java.awt.event.FocusListener;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.KeyListener;
14 import java.awt.event.TextEvent;
15 import java.awt.event.TextListener;
16 import java.text.DecimalFormat;
17 import java.util.regex.Matcher;
18 import java.util.regex.Pattern;
20 public class NumberField extends TextField {
21 private static final long serialVersionUID = 1L;
22 private static Pattern pattern = Pattern
23 .compile("(-)?[0-9,]+(\\.[0-9,]+)?");
24 private static final double initValue = 0;
26 private static DecimalFormat createDecimalFormat(int digit) {
27 DecimalFormat decimalFormat = new DecimalFormat();
28 decimalFormat.setMaximumFractionDigits(digit);
33 private double unitIncrement;// 上下キーを押したときに増減させる値 連続して押し続けると増減する値を増やす
34 private int displayDigit;// 小数点以下表示桁数
35 private DecimalFormat decimalFormat;
36 private boolean textChanged = false;
37 private boolean textChanging = false;
38 private int countIncrement = 0;// キーを連続して押した回数
40 private void updateText() {
41 this.textChanging = true;
42 super.setText(decimalFormat.format(value));
43 this.textChanging = false;
46 private void refreshText() {
48 this.setText(super.getText());
53 private void numberField_actionPerformed() {
57 private void numberField_focusLost(FocusEvent e) {
60 processActionEvent(new ActionEvent(e.getSource(), e.getID(), ""));
65 private void numberField_textChanged() {
67 this.textChanged = true;
71 private void numberField_keyPressed(KeyEvent e) {
72 switch (e.getKeyCode()) {
74 if (countIncrement >= 19) {
75 setValue(this.value + this.unitIncrement * 100);
76 } else if (countIncrement >= 10) {
77 setValue(this.value + this.unitIncrement * 10);
79 setValue(this.value + this.unitIncrement);
84 case KeyEvent.VK_DOWN:
85 if (countIncrement >= 19) {
86 setValue(this.value - this.unitIncrement * 100);
87 } else if (countIncrement >= 10) {
88 setValue(this.value - this.unitIncrement * 10);
90 setValue(this.value - this.unitIncrement);
95 case KeyEvent.VK_LEFT:
96 case KeyEvent.VK_RIGHT:
97 case KeyEvent.VK_BACK_SPACE:
98 case KeyEvent.VK_DELETE:
99 case KeyEvent.VK_ENTER:
102 switch (e.getKeyChar()) {
124 private void numberField_keyReleased(KeyEvent e) {
128 private void numberField_keyTyped(KeyEvent e) {
132 public NumberField() {
134 this.value = initValue;
135 this.unitIncrement = 0;
136 this.displayDigit = 0;
137 this.decimalFormat = createDecimalFormat(0);
139 this.addActionListener(new ActionListener() {
140 public void actionPerformed(ActionEvent e) {
141 numberField_actionPerformed();
144 this.addFocusListener(new FocusListener() {
145 public void focusGained(FocusEvent e) {
148 public void focusLost(FocusEvent e) {
149 numberField_focusLost(e);
152 this.addTextListener(new TextListener() {
153 public void textValueChanged(TextEvent e) {
154 numberField_textChanged();
157 this.addKeyListener(new KeyListener() {
158 public void keyPressed(KeyEvent e) {
159 numberField_keyPressed(e);
162 public void keyReleased(KeyEvent e) {
163 numberField_keyReleased(e);
166 public void keyTyped(KeyEvent e) {
167 numberField_keyTyped(e);
174 public double getValue() {
178 public void setValue(double value) {
184 public void setText(String s) {
185 Matcher m = pattern.matcher(s);
186 double value = m.find() ? Double.valueOf(m.group().replace(",", ""))
192 public double getUnitIncrement() {
193 return this.unitIncrement;
196 public void setUnitIncrement(double unitIncrement) {
197 this.unitIncrement = unitIncrement;
200 public int getDisplayDigit() {
201 return this.displayDigit;
204 public void setDisplayDigit(int displayDigit) {
205 this.displayDigit = displayDigit;
206 this.decimalFormat = createDecimalFormat(displayDigit);