73 lines
1.7 KiB
Java
73 lines
1.7 KiB
Java
import java.awt.event.*;
|
|
import javax.swing.*;
|
|
|
|
// Custom text field for use when creating new custom games
|
|
public class CustomTextField extends JTextField {
|
|
// The number of columns of characters to have
|
|
private static final int COLS = 4;
|
|
|
|
private final int MIN_VALUE;
|
|
private final int MAX_VALUE;
|
|
|
|
public CustomTextField(int defaultValue, int minValue, int maxValue) {
|
|
super(Integer.toString(defaultValue), COLS);
|
|
|
|
MIN_VALUE = minValue;
|
|
MAX_VALUE = maxValue;
|
|
|
|
addFocusListener(new FocusAdapter() {
|
|
// Auto select when focused
|
|
@Override
|
|
public void focusGained(FocusEvent e) {
|
|
selectAll();
|
|
}
|
|
|
|
// Auto format input when unfocused
|
|
@Override
|
|
public void focusLost(FocusEvent e) {
|
|
formatText();
|
|
}
|
|
});
|
|
}
|
|
|
|
protected void formatText() {
|
|
String text = getText();
|
|
|
|
// If tried to input a negative number, set it to the minimum
|
|
if (text.isEmpty() || text.charAt(0) == '-') {
|
|
setValue(getMinValue());
|
|
return;
|
|
}
|
|
|
|
// Remove all the nondigit characters and all leading zeros
|
|
String filteredText = text.replaceAll("(^[^1-9]+|\\D)", "");
|
|
if (filteredText.isEmpty()) {
|
|
setValue(getMinValue());
|
|
return;
|
|
}
|
|
|
|
// To prevent integer overflow when parsing, just set it to max
|
|
// when it's more than 4 digits
|
|
if (filteredText.length() > 4) {
|
|
setValue(getMaxValue());
|
|
return;
|
|
}
|
|
|
|
// Now that we finally have the intended int, clamp and set it
|
|
setValue(Difficulty.clampInt(Integer.parseInt(filteredText), getMinValue(), getMaxValue()));
|
|
}
|
|
|
|
// Use protected getters and setters so we can override them if necessary
|
|
protected int getMinValue() {
|
|
return MIN_VALUE;
|
|
}
|
|
|
|
protected int getMaxValue() {
|
|
return MAX_VALUE;
|
|
}
|
|
|
|
private void setValue(int value) {
|
|
setText(Integer.toString(value));
|
|
}
|
|
}
|