2015-01-14 167 views
-1

清除所有JTextField的我需要staticmethod我可以保持在任何publicclass,其中我將傳遞一個JInternalFrame的對象,它會自動清除所有的TextField特定JInternalFrame(使用環)..通過功能

我已經通過很多的答案了,但他們簡單地使用setText("")單獨爲所有的TextField的狀態,但那不是生產性的,僅僅是因爲在我的項目我計劃50個表格和超過500米的TextField ..

它如果有人向我提供帶有通訊的片段,將會有所幫助因此我可以理解其他組件的工作和實現,如複選框,收音機等我自己的

+0

你如何填充這些文本框的數據?那些與一些模型對象綁定?如果是,那麼你可以簡單地重置模型對象。 – eatSleepCode

+0

否它們沒有綁定,textFields即文本框是用戶輸入的普通字段。 –

回答

2

保持簡短。

類具有靜態函數:

public class JCTest 
{ 
    public static void Clear(JInternalFrame intFrame) 
    { 
     if (intFrame == null) 
      return; 
     Container con = intFrame.getContentPane(); 
     for (Component c : con.getComponents()) 
     { 
      if (c instanceof JTextField) 
      { 
       JTextField j = (JTextField)c; 
       j.setText(""); 
      } 
     } 
    } 
} 

稱之爲:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     JInternalFrame intFrame = new JInternalFrame(); 
     JCTest.Clear(intFrame); 
    } 
} 
+0

卓越的代碼,工程非常好,簡短和簡單:) –

+0

可以編輯它嗎?我的意思是你可以修改它,以便我可以把它作爲靜態方法放入類中,並將JinternalFrame的對象傳遞給它並清除所有內容?代碼是好的,我把它放在相同的框架..你可以修改它? –

+0

@RajitBansal修改它。這不是那麼難... – Blacktempel

1

基本上,您可以調用getComponents()方法,該方法將返回所有子組件。然後你必須檢查它是否是JTextField類型,然後你可以調用.setText(「」)。如果您想爲所有Swing組件提供類似的解決方案,則可以使用Document,這是組件顯示的數據的抽象。這裏是一個例子:

if (rootComponent instanceof Container) { 
    Component[] subComponents = ((Container) rootComponent).getComponents(); 
     for (Component c : subComponents) { 
      if (c instanceof JTextField) 
       c.setText(""); 
     } 
    } 

編輯這是從我的項目,我已經分裂成兩種方法。 ApplyColors,因爲我使用它來着色組件。我認爲它也適用於setText()。

public static void applyColors(Window parent) { 
    List<String> colorComponentsClassNames = Arrays.asList("JTextField"); 
     for (Component component : getAllComponents(parent)) { 
     Component[] components = ((Container) component).getComponents(); 
     for (int i = 0; i < components.length; i++) { 
      Component currentComponent = components[i]; 
      if (!colorComponentsClassNames.contains(currentComponent.getClass().getSimpleName())) { 
       continue; 
      } 
      currentComponent.setText("")); 

     } 
    } 
} 

public static List<Component> getAllComponents(final Container c) { 
    Component[] comps = c.getComponents(); 
    List<Component> compList = new ArrayList<Component>(); 
    for (Component comp : comps) { 
     compList.add(comp); 
     if (comp instanceof Container) { 
      compList.addAll(getAllComponents((Container) comp)); 
     } 
    } 
    return compList; 
} 
+0

這將只適用於一個'容器'... – MadProgrammer

+0

如果我想在其他類中使用它,我可以使用它作爲全局函數,我可以將Form或rootCompnent作爲參數傳遞給它嗎? –

+0

那就是@MadProgrammer的問題。只需傳入JInternalFrame即可。 –

1

你可以...

使用Container#getComponents列出一個給定的Container的所有子組件,您將需要檢查每個Component和測試,看它是否是一個instanceofJTextField,當你發現一個組件,它將其投射並使用setText來清除該字段。您還需要測試每個Component,看它是否是一個instanceofContainer和執行遞歸搜索,如getComponents將只返回指定Container

眼前的孩子這是怎麼樣的混亂和費時的,因爲你需要遍歷整個組件層次結構以確保找到所有字段。這也意味着,它會清除你其實並不想清楚領域...

你可以...

創建一個自定義類,從JInternalFrame或其他一些類像JPanel,其中有一個延伸方法,例如clearFields(例如),它可以簡單地循環通過JTextFieldList。然後

您需要添加要通過這種方法管理的List各個領域,但它是一個簡單的機制......

public class MyAwesomeForm extends JPanel { 
    private List<JTextField> fields; 

    public void registerField(JTextField field) { 
     fields.add(field); 
    } 

    public void unregisterField(JTextField field) { 
     fields.remove(field); 
    } 

    public void clearFields() { 
     for (JTextField field : fields) { 
      field.setText(null); 
     } 
    } 
} 

您所有的形式都需要從這個當延長您只需撥打clearFields給定的表格...

+0

基本上對於我使用NetBeans的項目,它不會自動添加所有組件到列表中,並且手動執行它會消耗很多時間..沒有使用LIST的任何其他代碼 –

+0

嗯,我認爲第一種方法更好......因爲爲什麼我們應該浪費內存(使用第二種方法)註冊/存儲'jtextfield'(s)如果容器確實爲我們維護它!而第一種方法並不是凌亂的...... – Junaid

+0

@Junaid因爲它像使用大錘殺死蒼蠅一樣,它可能有效,但是在這個過程中你往往會破壞更多的東西。第一個建議也不允許您「過濾」該過程,以避免重置您可能不想清除的字段。它也使用遞歸方法,填滿堆棧,所以如果你擔心內存,第二種方法實際上更便宜和更快。 – MadProgrammer