From 7c782ba07441ec472acfadcebd5e6bd3707690e4 Mon Sep 17 00:00:00 2001 From: David McCann Date: Thu, 15 Jun 2017 13:34:59 -0400 Subject: [PATCH] Fix #128. (#132) o New flavor of stackoverflow approach for number-only JSpinners o JSpinners don't fire focus events, so use ChangeListener instead o Actually ran ./gradlew test check this time (sorry) --- .../briefcase/model/BriefcasePreferences.java | 2 +- .../briefcase/ui/JIntegerSpinner.java | 45 +++++-------------- .../briefcase/ui/SettingsPanel.java | 17 ++++--- 3 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/org/opendatakit/briefcase/model/BriefcasePreferences.java b/src/org/opendatakit/briefcase/model/BriefcasePreferences.java index 7f9b3cc56..5dc8b0cde 100644 --- a/src/org/opendatakit/briefcase/model/BriefcasePreferences.java +++ b/src/org/opendatakit/briefcase/model/BriefcasePreferences.java @@ -121,7 +121,7 @@ public static void setBriefcaseProxyProperty(HttpHost value) { Preference.APPLICATION_SCOPED.remove(BRIEFCASE_PROXY_PORT_PROPERTY); } else { Preference.APPLICATION_SCOPED.put(BriefcasePreferences.BRIEFCASE_PROXY_HOST_PROPERTY, value.getHostName()); - Preference.APPLICATION_SCOPED.put(BriefcasePreferences.BRIEFCASE_PROXY_PORT_PROPERTY, "" + value.getPort()); + Preference.APPLICATION_SCOPED.put(BriefcasePreferences.BRIEFCASE_PROXY_PORT_PROPERTY, new Integer(value.getPort()).toString()); } } diff --git a/src/org/opendatakit/briefcase/ui/JIntegerSpinner.java b/src/org/opendatakit/briefcase/ui/JIntegerSpinner.java index c8316745c..267e029e6 100644 --- a/src/org/opendatakit/briefcase/ui/JIntegerSpinner.java +++ b/src/org/opendatakit/briefcase/ui/JIntegerSpinner.java @@ -1,49 +1,24 @@ package org.opendatakit.briefcase.ui; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.text.DecimalFormat; +import javax.swing.JFormattedTextField; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.DocumentFilter; -import javax.swing.text.JTextComponent; -import javax.swing.text.PlainDocument; +import javax.swing.text.NumberFormatter; //Sources: -//https://stackoverflow.com/questions/16632104/jspinner-with-display-format-numbers-only-and-manual-edit -//http://stackoverflow.com/questions/20541230/allow-only-numbers-in-jtextfield +//https://stackoverflow.com/questions/6449350/make-jspinner-completely-numeric public class JIntegerSpinner extends JSpinner { public JIntegerSpinner(int value, int min, int max, int step) { super (new SpinnerNumberModel(8080, 0, 65535, 1)); - JTextComponent txt = ((JSpinner.DefaultEditor) this.getEditor()).getTextField(); - txt.setDocument(new IntegerDocument()); - } - - private class IntegerDocument extends PlainDocument { - private IntegerDocumentFilter filter; - - protected IntegerDocument() { - filter = new IntegerDocumentFilter(); - } - @Override - public DocumentFilter getDocumentFilter() { - return filter; - } - } - - private class IntegerDocumentFilter extends DocumentFilter { - @Override - public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { - Pattern regEx = Pattern.compile("\\d*"); - Matcher matcher = regEx.matcher(text); - if(!matcher.matches()){ - return; - } - super.replace(fb, offset, length, text, attrs); - } + JFormattedTextField txt = ((JSpinner.NumberEditor) this.getEditor()).getTextField(); + NumberFormatter formatter = (NumberFormatter)txt.getFormatter(); + formatter.setFormat(new DecimalFormat("#####")); + formatter.setAllowsInvalid(false); + ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); + txt.setValue(value); } } diff --git a/src/org/opendatakit/briefcase/ui/SettingsPanel.java b/src/org/opendatakit/briefcase/ui/SettingsPanel.java index b531279ce..e2a4ba863 100644 --- a/src/org/opendatakit/briefcase/ui/SettingsPanel.java +++ b/src/org/opendatakit/briefcase/ui/SettingsPanel.java @@ -16,6 +16,8 @@ import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.apache.http.HttpHost; import org.opendatakit.briefcase.model.BriefcasePreferences; @@ -56,18 +58,18 @@ public SettingsPanel(MainBriefcaseWindow parentWindow) { btnChoose = new JButton("Change..."); btnChoose.addActionListener(new FolderActionListener()); - FocusListener proxyFocusListener = new ProxyFocusListener(); + ProxyChangeListener proxyChangeListener = new ProxyChangeListener(); lblHost = new JLabel(MessageStrings.PROXY_HOST); txtHost = new JTextField(); txtHost.setEnabled(false); txtHost.setColumns(20); - txtHost.addFocusListener(proxyFocusListener); + txtHost.addFocusListener(proxyChangeListener); lblPort = new JLabel(MessageStrings.PROXY_PORT); spinPort = new JIntegerSpinner(8080, 0, 65535, 1); spinPort.setEnabled(false); - spinPort.addFocusListener(proxyFocusListener); + spinPort.addChangeListener(proxyChangeListener); lblProxy = new JLabel(MessageStrings.PROXY_TOGGLE); chkProxy = new JCheckBox(); @@ -185,10 +187,10 @@ public void actionPerformed(ActionEvent e) { } - class ProxyFocusListener implements FocusListener { + class ProxyChangeListener implements FocusListener, ChangeListener { @Override - public void focusGained(FocusEvent e) { + public void focusGained(FocusEvent e) { } @Override @@ -196,6 +198,11 @@ public void focusLost(FocusEvent e) { updateProxySettings(); } + @Override + public void stateChanged(ChangeEvent e) { + updateProxySettings(); + } + } }