Swing jgoodies绑定:使用带有格式化数字的JTextField?
我正在尝试使用JGoodies绑定将一个JTextField绑定到一个bean的字段,该bean的字段是一个Swing jgoodies绑定:使用带有格式化数字的JTextField?,swing,binding,jtextfield,jgoodies,Swing,Binding,Jtextfield,Jgoodies,我正在尝试使用JGoodies绑定将一个JTextField绑定到一个bean的字段,该bean的字段是一个double: JTextField myJTextField = ... BeanAdapter adapter = ... Bindings.bind(myJTextField, ConverterFactory.createStringConverter(adapter.getValueModel("amplitude"), new Decim
double
:
JTextField myJTextField = ...
BeanAdapter adapter = ...
Bindings.bind(myJTextField,
ConverterFactory.createStringConverter(adapter.getValueModel("amplitude"),
new DecimalFormat("0.00000")));
至少在豆子里是这样→ JTextField方向。在JTextField中→ bean方向,它有一个缺陷:如果我开始输入JTextField,它会在小数点后的第一位之后立即更新,弄乱JTextField焦点,并调整JTextField值
(问题似乎来自于试图将GUI的字符串
调整为模型的双字符串
)
我该如何解决这个问题
演示这一点的示例程序:
package com.example.test.gui;
import java.awt.GridLayout;
import java.beans.PropertyChangeListener;
import java.text.DecimalFormat;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import com.jgoodies.binding.adapter.Bindings;
import com.jgoodies.binding.adapter.BoundedRangeAdapter;
import com.jgoodies.binding.beans.BeanAdapter;
import com.jgoodies.binding.beans.ExtendedPropertyChangeSupport;
import com.jgoodies.binding.value.ConverterFactory;
public class FloatPointBinding {
public static class MyModel {
private int x;
final private ExtendedPropertyChangeSupport changeSupport =
new ExtendedPropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener x) {
this.changeSupport.addPropertyChangeListener(x);
}
public void removePropertyChangeListener(PropertyChangeListener x) {
this.changeSupport.removePropertyChangeListener(x);
}
static private int clip(int a)
{
return Math.min(Math.max(a, -32768), 32767);
}
static private int d2i(double a) {
return clip((int) Math.floor(a*32768 + 0.5));
}
static private double i2d(int a) {
return (clip(a)/32768.0);
}
public void setXCount(int x) {
int oldX = this.x;
int newX = x;
this.x=newX;
this.changeSupport.firePropertyChange("x", i2d(oldX), i2d(newX));
this.changeSupport.firePropertyChange("XCount", oldX, newX);
}
public void setX(double x) { setXCount(d2i(x)); }
public double getX() { return i2d(this.x); }
public int getXCount() { return this.x; }
}
public static class MyView extends JFrame
{
public MyView(MyModel model, String title)
{
super(title);
JTextField jtf = new JTextField();
JSlider jsl = new JSlider();
jsl.setMinimum(-32768);
jsl.setMaximum(32767);
jsl.setMajorTickSpacing(4096);
jsl.setPaintTicks(true);
Hashtable labelTable = new Hashtable();
labelTable.put( new Integer( -32768 ), new JLabel("-1") );
labelTable.put( new Integer( 0 ), new JLabel("0") );
labelTable.put( new Integer( 32767 ), new JLabel("1") );
jsl.setLabelTable( labelTable );
jsl.setPaintLabels(true);
setLayout(new GridLayout());
add(jsl);
add(jtf);
BeanAdapter adapter = new BeanAdapter(model, true);
Bindings.bind(jtf,
ConverterFactory.createStringConverter(adapter.getValueModel("x"),
new DecimalFormat("0.#####")));
jsl.setModel(new BoundedRangeAdapter(adapter.getValueModel("XCount"), 0, -32768, 32767));
}
}
public static void main(String[] args)
{
MyModel model = new MyModel();
MyView view = new MyView(model, "FloatPointBinding");
view.pack();
view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
view.setVisible(true);
}
}
我不确定这是否是您试图解决的问题,但是如果您将绑定更改为仅提交焦点丢失,那么您就不应该再有这个问题了。只需将true指定为下面bind方法的第三个参数:
Bindings.bind(jtf,
ConverterFactory.createStringConverter(adapter.getValueModel("x"),
new DecimalFormat("0.#####")),
true);
哦,好吧,我不知道你能做到。它没有即时更新那么好,但更可靠,可能是正确的处理方式。谢谢