1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
package bjc.utils.gui;
import java.awt.Component;
import java.awt.Frame;
import java.util.function.Function;
import java.util.function.Predicate;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import bjc.utils.gui.layout.VLayout;
/**
* Utility class for getting simple input from the user.
*
* @author ben
*
*/
public class SimpleDialogs {
/**
* Get a bounded integer from the user.
*
* @param parent
* The parent component for the dialogs.
* @param title
* The title for the dialogs.
* @param prompt
* The prompt to tell the user what to enter.
* @param lower
* The lower integer bound to accept.
* @param upper
* The upper integer bound to accept.
* @return A int within the specified bounds.
*/
public static int getBoundedInt(Component parent, String title,
String prompt, int lower, int upper) {
return getValue(parent, title, prompt, s -> {
try {
int n = Integer.parseInt(s);
return (n < upper) && (n > lower);
} catch (NumberFormatException nfe) {
return false;
}
} , Integer::parseInt);
}
/**
* Asks the user to pick an option from a series of choices.
*
* @param parent
* The parent frame for this dialog
* @param title
* The title of this dialog
* @param question
* The question being asked
* @param choices
* The available choices for the question
* @return The choice the user picked, or null if they didn't pick one
*/
@SuppressWarnings("unchecked")
public static <E> E getChoice(Frame parent, String title,
String question, E... choices) {
JDialog jd = new JDialog(parent, title, true);
jd.setLayout(new VLayout(2));
JPanel questionPane = new JPanel();
JLabel questionText = new JLabel(question);
JComboBox<E> questionChoices = new JComboBox<>(choices);
questionPane.add(questionText);
questionPane.add(questionChoices);
JPanel buttonPane = new JPanel();
JButton okButton = new JButton("Ok");
okButton.addActionListener(e -> jd.dispose());
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(e -> jd.dispose());
buttonPane.add(cancelButton);
buttonPane.add(okButton);
jd.add(questionPane);
jd.add(buttonPane);
jd.pack();
jd.setVisible(true);
return (E) questionChoices.getSelectedItem();
}
/**
* Get a integer from the user
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for dialogs.
* @param prompt
* The prompt to tell the user what to enter.
* @return A int.
*/
public static int getInt(Component parent, String title,
String prompt) {
return getValue(parent, title, prompt, s -> {
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException nfe) {
return false;
}
} , Integer::parseInt);
}
/**
* Get a string from the user
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for the dialogs.
* @param prompt
* The prompt to tell the user what to enter.
* @return A string.
*/
public static String getString(Component parent, String title,
String prompt) {
return JOptionPane.showInputDialog(parent, prompt, title,
JOptionPane.QUESTION_MESSAGE);
}
/**
* Get a value parsable from a string from the user.
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for dialogs.
* @param prompt
* The prompt to tell the user what to enter.
* @param p
* A predicate to determine if a input is valid.
* @param f
* The function to transform the string into a value.
* @return The value parsed from a string.
*/
public static <E> E getValue(Component parent, String title,
String prompt, Predicate<String> p, Function<String, E> f) {
String inp = getString(parent, title, prompt);
while (!p.test(inp)) {
showError(parent, "I/O Error", "Please enter a valid value");
inp = getString(parent, title, prompt);
}
return f.apply(inp);
}
/**
* Get a whole number from the user.
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for dialogs.
* @param prompt
* The prompt to tell the user what to enter.
* @return A whole number.
*/
public static int getWhole(Component parent, String title,
String prompt) {
return getBoundedInt(parent, title, prompt, 0, Integer.MAX_VALUE);
}
/**
* Ask the user a Yes/No question.
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for dialogs.
* @param question
* The question to ask the user.
* @return True if the user said yes, false otherwise.
*/
public static boolean getYesNo(Component parent, String title,
String question) {
int res = JOptionPane.showConfirmDialog(parent, question, title,
JOptionPane.YES_NO_OPTION);
return (res == JOptionPane.YES_OPTION ? true : false);
}
/**
* Show a error message to the user
*
* @param parent
* The parent component for dialogs.
* @param title
* The title for dialogs.
* @param err
* The error to show the user.
*/
public static void showError(Component parent, String title,
String err) {
JOptionPane.showMessageDialog(parent, err, title,
JOptionPane.ERROR_MESSAGE);
}
}
|