I have built a small calculator in a popup dialog. My numbered buttons simply append a number to the text field. The response on the Nexus 7, the only device I have right now other than the simulator, is often slow. Sometimes it take 4-5 seconds for me to hear the echo click and for the number to show up in the next field. Sometime the number doesn't show up until I tap another number, and then they both go into the text field at once. Any ideas? Code is attached...
package com.dbw.firstplayer;
import com.codename1.charts.util.ColorUtil;
import com.codename1.ui.*;
import com.codename1.ui.events.ActionEvent;
import com.codename1.ui.events.ActionListener;
import com.codename1.ui.table.TableLayout;
import java.util.ArrayList;
/**
* Created by dwilliams on 4/10/2015.
*/
public class NumberDialog extends Dialog {
private final int TEXT_COLOR = ColorUtil.WHITE;
private TableLayout _layout;
private NumberTextField _display;
private Button _btn1;
private Button _btn2;
private Button _btn3;
private Button _btn4;
private Button _btn5;
private Button _btn6;
private Button _btn7;
private Button _btn8;
private Button _btn9;
private Button _btn0;
private Button _btnDivide;
private Button _btnMultiply;
private Button _btnPlus;
private Button _btnMinus;
private Button _btnEquals;
private Button _btnClear;
private Button _btnBackSpace;
private Button _btnOK;
private Button _btnCancel;
private Label _lblPendingOp;
enum OP {
DIVIDE("/"),
MULTIPLY("x"),
PLUS("+"),
MINUS("-"),
EQUALS(""),
NUMBER("");
String _text; // String to display in _lblPendingOp
OP(String txt) {
_text = txt;
}
public String toString() {
return _text;
}
};
private OP _lastOp = OP.NUMBER; // Type of button last pressed.
private OP _pendingOp = OP.EQUALS; // Type of pending operation. Cannot be OP.NUMBER
private long _lastValue = 0;
private boolean _isClearOnNextDigit = false;
private ArrayList<INumberListener> _numberListeners = new ArrayList<INumberListener>();
public NumberDialog() {
setTitle("Enter a Score");
TableLayout.Constraint c;
_layout = new TableLayout(6, 5);
setLayout(_layout);
int row;
final int COL_SPAN = 5; // span all columns
// row zero: sign, display, pending operation
row = 0;
_display = new NumberTextField();
c = _layout.createConstraint(row, 0);
c.setHorizontalSpan(COL_SPAN - 1);
addComponent(c, _display.getComponent());
_lblPendingOp = new Label();
_lblPendingOp.getStyle().setFgColor(TEXT_COLOR);
c = _layout.createConstraint(row, 4);
addComponent(c, _lblPendingOp);
// row one: 7, 8, 9, /, and C
row = 1;
_btn7 = createNumberButton(7);
c = _layout.createConstraint(row, 0);
addComponent(c, _btn7);
_btn8 = createNumberButton(8);
c = _layout.createConstraint(row, 1);
addComponent(c, _btn8);
_btn9 = createNumberButton(9);
c = _layout.createConstraint(row, 2);
addComponent(c, _btn9);
_btnDivide = createOpButton(OP.DIVIDE);
c = _layout.createConstraint(row, 3);
addComponent(c, _btnDivide);
_btnClear = createClearButton();
c = _layout.createConstraint(row, 4);
addComponent(c, _btnClear);
// row two: 4, 5, 6, and backspace
row = 2;
_btn4 = createNumberButton(4);
c = _layout.createConstraint(row, 0);
addComponent(c, _btn4);
_btn5 = createNumberButton(5);
c = _layout.createConstraint(row, 1);
addComponent(c, _btn5);
_btn6 = createNumberButton(6);
c = _layout.createConstraint(row, 2);
addComponent(c, _btn6);
_btnMultiply = createOpButton(OP.MULTIPLY);
c = _layout.createConstraint(row, 3);
addComponent(c, _btnMultiply);
_btnBackSpace = createBackspaceButton();
c = _layout.createConstraint(row, 4);
addComponent(c, _btnBackSpace);
// row three: 1, 2, 3, -, and equals
row = 3;
_btn1 = createNumberButton(1);
c = _layout.createConstraint(row, 0);
addComponent(c, _btn1);
_btn2 = createNumberButton(2);
c = _layout.createConstraint(row, 1);
addComponent(c, _btn2);
_btn3 = createNumberButton(3);
c = _layout.createConstraint(row, 2);
addComponent(c, _btn3);
_btnMinus = createOpButton(OP.MINUS);
c = _layout.createConstraint(row, 3);
addComponent(c, _btnMinus);
_btnEquals = createOpButton(OP.EQUALS);
c = _layout.createConstraint(row, 4);
c.setVerticalSpan(2);
addComponent(c, _btnEquals);
// row four: 0, +, =
row = 4;
_btn0 = createNumberButton(0);
c = _layout.createConstraint(row, 0);
c.setHorizontalSpan(3);
addComponent(c, _btn0);
_btnPlus = createOpButton(OP.PLUS);
c = _layout.createConstraint(row, 3);
addComponent(c, _btnPlus);
// row 5: ok, cancel
row = 5;
_btnOK = createOKButton();
c = _layout.createConstraint(row, 0);
c.setHorizontalSpan(2);
addComponent(c, _btnOK);
_btnCancel = createCancelButton();
c = _layout.createConstraint(row, 2);
c.setHorizontalSpan(3);
addComponent(c, _btnCancel);
}
public void addNumberListener(INumberListener l) {
if (!_numberListeners.contains(l)) {
_numberListeners.add(l);
}
}
private Button createNumberButton(long n) {
Button btn = new Button(Long.toString(n));
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new AppendNumberActionListener(n));
return btn;
}
private Button createClearButton() {
Button btn = new Button("C");
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new ClearActionListener());
return btn;
}
private Button createBackspaceButton() {
Button btn = new Button("<");
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new BackspaceActionListener());
return btn;
}
private Button createOpButton(OP op) {
Button btn = new Button(op == OP.EQUALS ? "=" : op.toString());
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new OperationActionListener(op));
return btn;
}
private Button createOKButton() {
Button btn = new Button("OK");
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
evaluate();
fireNumberListeners();
dispose();
}
});
return btn;
}
private Button createCancelButton() {
Button btn = new Button("Cancel");
btn.getStyle().setFgColor(TEXT_COLOR);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
dispose();
}
});
return btn;
}
private void evaluate() {
long value = _display.getValue();
switch (_pendingOp) {
case DIVIDE:
_lastValue /= value;
break;
case MULTIPLY:
_lastValue *= value;
break;
case PLUS:
_lastValue += value;
break;
case MINUS:
_lastValue -= value;
break;
default:
_lastValue = value;
}
_display.forceValue(_lastValue);
}
private void fireNumberListeners() {
for (INumberListener l: _numberListeners) {
l.onChange(_lastValue);
}
}
private class AppendNumberActionListener implements ActionListener {
private long _value;
public AppendNumberActionListener(long value) {
_value = value;
}
@Override
public void actionPerformed(ActionEvent evt) {
if (_lastOp == OP.NUMBER) {
_display.appendDigit(_value);
} else if (_lastOp.equals(OP.EQUALS)) {
_display.setValue(_value);
} else {
_display.setValue(_value);
}
_lastOp = OP.NUMBER;
}
}
private class ClearActionListener implements ActionListener {
public ClearActionListener() {
}
@Override
public void actionPerformed(ActionEvent evt) {
_display.setValue(0);
_lastOp = OP.EQUALS;
_pendingOp = OP.EQUALS;
_lblPendingOp.setText(OP.EQUALS.toString());
}
}
private class BackspaceActionListener implements ActionListener {
public BackspaceActionListener() {
}
@Override
public void actionPerformed(ActionEvent evt) {
if (_lastOp == OP.EQUALS || _lastOp == OP.NUMBER) {
_display.backSpace();
} else {
_lastOp = OP.EQUALS;
_lblPendingOp.setText(OP.EQUALS.toString());
}
}
}
private class OperationActionListener implements ActionListener {
private OP _op;
public OperationActionListener(OP op) {
_op = op;
}
@Override
public void actionPerformed(ActionEvent evt) {
evaluate();
_lastOp = _op;
_pendingOp = _op;
_lblPendingOp.setText(_op.toString());
}
}
private class NumberTextField {
private TextField _textfield;
private long _value = 0;
public NumberTextField() {
_textfield = new TextField("0", 10);
_textfield.setEditable(false);
_textfield.setAlignment(Component.RIGHT);
}
public Component getComponent() {
return _textfield;
}
public void setValue(long value) {
if (value < -99999 || value > 99999) {
return;
}
_value = value;
_textfield.setText(Long.toString(value));
_textfield.repaint();
}
public void forceValue(long value) {
_value = value;
_textfield.setText(Long.toString(value));
_textfield.repaint();
}
public long getValue() {
return _value;
}
public void appendDigit(long d) {
setValue(_value * 10 + d);
}
public void backSpace() {
setValue(_value/10);
}
}
}
IDE: IDEA
Desktop OS: Windows 8
Simulator; N/A
Device: Nexus 7