source: src/main/java/genius/gui/panels/DoublePanel.java@ 256

Last change on this file since 256 was 229, checked in by Tim Baarslag, 5 years ago

Made an elicitation cost jspinner

File size: 3.2 KB
Line 
1package genius.gui.panels;
2
3import java.awt.BorderLayout;
4import java.awt.Dimension;
5
6import javax.swing.JComponent;
7import javax.swing.JFormattedTextField;
8import javax.swing.JLabel;
9import javax.swing.JOptionPane;
10import javax.swing.JPanel;
11import javax.swing.JSpinner;
12import javax.swing.JTextField;
13import javax.swing.SpinnerNumberModel;
14import javax.swing.SwingConstants;
15import javax.swing.SwingUtilities;
16import javax.swing.event.DocumentEvent;
17import javax.swing.event.DocumentListener;
18
19import genius.core.listener.Listener;
20
21/**
22 * Shows a single text line input area for a double value.
23 */
24@SuppressWarnings("serial")
25public class DoublePanel extends JPanel
26{
27 private final JLabel jlabel;
28 private final JTextField textfield;
29 DoubleModel model;
30
31 public DoublePanel(String label, final DoubleModel model)
32 {
33 setLayout(new BorderLayout());
34
35 this.model = model;
36 setLayout(new BorderLayout());
37
38 this.jlabel = new JLabel(label);
39 jlabel.setHorizontalAlignment(SwingConstants.RIGHT);
40 add(jlabel, BorderLayout.WEST);
41
42 JSpinner jSpinner = new JSpinner(new SpinnerNumberModel((double) model.getValue(), 0, 1, 0.001));
43 jSpinner.setMaximumSize(new Dimension(300, 30));
44 this.textfield = getTextField(jSpinner);
45 this.textfield.setColumns(5);
46
47 add(jSpinner, BorderLayout.EAST);
48
49 // not working?
50 // setMaximumSize(new Dimension(99999999, 30));
51 textfield.getDocument().addDocumentListener(new DocumentListener() {
52
53 @Override
54 public void removeUpdate(DocumentEvent e) {
55 if (!textfield.getText().isEmpty())
56 {
57 model.setText(parseDouble());
58 }
59 // we ignore empty text to avoid reacting on replace procedure
60 // too early
61 }
62
63 @Override
64 public void insertUpdate(DocumentEvent e) {
65 model.setText(parseDouble());
66 }
67
68 @Override
69 public void changedUpdate(DocumentEvent e) {
70 model.setText(parseDouble());
71 }
72 });
73
74 model.addListener(new Listener<Double>() {
75 @Override
76 public void notifyChange(final Double data) {
77 SwingUtilities.invokeLater(new Runnable() {
78
79 @Override
80 public void run() {
81 textfield.setText("" + data);
82 updateEnabledness();
83 }
84 });
85 }
86 });
87
88 updateEnabledness();
89 }
90
91 private void updateEnabledness()
92 {
93 boolean enabled = !model.isLocked();
94 setEnabled(enabled);
95 textfield.setEnabled(enabled);
96 jlabel.setEnabled(enabled);
97 }
98
99 private double parseDouble()
100 {
101 double d = 0;
102 String text = textfield.getText();
103 String err = "The value \"" + text + "\" is not a valid number.";
104 try {
105 d = Double.parseDouble(text);
106 if (d < 0 || d > 1) {
107 showError(err);
108 return 0;
109 }
110 } catch (Exception e) {
111 showError(err);
112 return 0;
113 }
114 return d;
115 }
116
117 private void showError(String error)
118 {
119 JOptionPane.showMessageDialog(null, error, "Edit error", 0);
120 }
121
122 private JFormattedTextField getTextField(JSpinner spinner) {
123 JComponent editor = spinner.getEditor();
124 if (editor instanceof JSpinner.DefaultEditor) {
125 return ((JSpinner.DefaultEditor)editor).getTextField();
126 } else {
127 System.err.println("Unexpected editor type: "
128 + spinner.getEditor().getClass()
129 + " isn't a descendant of DefaultEditor");
130 return null;
131 }
132 }
133}
Note: See TracBrowser for help on using the repository browser.