2012-09-09 42 views
2

是否有任何方法來自動綁定Swing JTextFields信息類。例如JText字段值綁定到信息類

private JTextField receiptId; 
private JTextField Id; 


public class Info { 
    private string receiptId; 
    private String id; 

    // Getters and Setters 
    } 

當我從Swing頁面輸入值然後自動將值綁定到我的Info類時,是否有任何方法?之後,我可以將我的Info對象傳遞給其他類而不是發送所有文本字段。

回答

5

此「綁定」通常使用DocumentListener完成。

從您的JTextFields的每一位註冊的聽衆打電話給您的設定人員Info.setReceiptId()Info.setId()

+0

+1它的更好的方法,我知道要做到這一點。 – ThierryB

+0

很好的答案。我在帖子中爲您的想法添加了一個工作解決方案。不知道我能否以任何方式將我的答案鏈接到你的答案。 – javatarz

4

這裏是爲您複製粘貼的樂趣:)

工作的解決方案這是做魔術..監聽;)

public class BindingListener implements DocumentListener { 
    private ModelObject model; 
    private String fieldName; 

    public BindingListener(ModelObject model, String fieldName) { 
     this.model = model; 

     String firstChar = String.valueOf(fieldName.charAt(0)); 
     if (firstChar.equals(firstChar.toLowerCase())) { 
      fieldName = firstChar.toUpperCase() 
        + fieldName.substring(1, fieldName.length()); 
     } 

     this.fieldName = fieldName; 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     dataUpdated(e); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     dataUpdated(e); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     dataUpdated(e); 
    } 

    private void dataUpdated(DocumentEvent e) { 
     try { 
      String text = e.getDocument().getText(
        e.getDocument().getStartPosition().getOffset(), 
        e.getDocument().getEndPosition().getOffset() - 1); 
      System.out.println("Entered text: " + text); 
      System.out.println("Field to be updated: " + fieldName); 

      System.out.println("Old model values: " + model); 

      Method method = model.getClass().getDeclaredMethod(
        "set" + fieldName, String.class); 
      method.invoke(model, text); 

      System.out.println("New model values: " + model); 
     } catch (BadLocationException e1) { 
      e1.printStackTrace(); 
     } catch (NoSuchMethodException e1) { 
      e1.printStackTrace(); 
     } catch (SecurityException e1) { 
      e1.printStackTrace(); 
     } catch (IllegalAccessException e1) { 
      e1.printStackTrace(); 
     } catch (IllegalArgumentException e1) { 
      e1.printStackTrace(); 
     } catch (InvocationTargetException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

假設你的模型對象看起來像下面的類。

public class ModelObject { 
    private String field1; 
    private String field2; 

    /** 
    * @return the field1 
    */ 
    public String getField1() { 
     return field1; 
    } 

    /** 
    * @param field1 
    *   the field1 to set 
    */ 
    public void setField1(String field1) { 
     this.field1 = field1; 
    } 

    /** 
    * @return the field2 
    */ 
    public String getField2() { 
     return field2; 
    } 

    /** 
    * @param field2 
    *   the field2 to set 
    */ 
    public void setField2(String field2) { 
     this.field2 = field2; 
    } 

    @Override 
    public String toString() { 
     return "ModelObject [field1=" + field1 + ", field2=" + field2 + "]"; 
    } 
} 

假設你的GUI正在代碼,比如這個..

JTextField textField1 = new JTextField(); 
textField1.setPreferredSize(new Dimension(100, 25)); 
JTextField textField2 = new JTextField(); 
textField2.setPreferredSize(new Dimension(100, 25)); 
panel.add(textField1); 
panel.add(textField2); 

ModelObject model = new ModelObject(); 

textField1.getDocument().addDocumentListener(new BindingListener(model, "field1")); 
textField2.getDocument().addDocumentListener(new BindingListener(model, "field2")); 

更新:下面是一些樣本輸出以及..

Entered text: x 
Field to be updated: Field1 
Old model values: ModelObject [field1=null, field2=null] 
New model values: ModelObject [field1=x, field2=null] 
Entered text: y 
Field to be updated: Field2 
Old model values: ModelObject [field1=x, field2=null] 
New model values: ModelObject [field1=x, field2=y]