2009-12-28 23 views
4

我试图绑定一个JTextField到Bean的字段是一个double使用JGoodies数据绑定:jgoodies绑定:使用格式化数字的JTextField?

JTextField myJTextField = ... 
BeanAdapter adapter = ... 
Bindings.bind(myJTextField, 
ConverterFactory.createStringConverter(adapter.getValueModel("amplitude"), 
        new DecimalFormat("0.00000"))); 

这工作,在bean → JTextField的方向至少。在JTextField → bean的方向上,它有一个问题:如果我开始键入JTextField,它会在小数点后的第一位后立即更新我的更新,混淆JTextField焦点并调整我的JTextField值。

(这个问题似乎来自努力适应一个GUI的String到一个模型的double

我该如何解决这个问题????

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); 
    } 
} 

回答

2

我不知道这是否是你想怎么解决,但如果你更改绑定只犯焦点失去你不应该有这个问题:

演示此

示例程序了。只要指定真正作为第三个参数下面的绑定方法:

Bindings.bind(jtf, 
       ConverterFactory.createStringConverter(adapter.getValueModel("x"), 
         new DecimalFormat("0.#####")), 
       true); 
+0

哦 - 好吧,我不知道你能做到这一点。它不如即时更新,但更可靠+可能是正确的方式来处理它。谢谢! – 2009-12-29 22:37:33