2012-10-21 28 views
7

在我的Swing應用程序中,用戶必須在切換到下一個窗口之前插入數字和值。現在作爲一個乾淨的程序應該檢查每個輸入是否有效,如果不是,顯示錯誤消息並且下一個窗口不打開。Java Swing:實現輸入值的有效性檢查

此次檢查的結構如下(舉例):

Button buttonToOpenNextWindow = new JButton("next"); 
button.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e){ 
     if(checkValidty){ 
      // (...) 
      new WindowA(); 
      frame.dispose(); // (*) 
     } 
    } 
}); 

(*)注:我知道多JFrames的原則是醜,我在改變這種狀況,但對於這個問題它是無關緊要的。

現在這個問題的焦點是這個checkValidity(),這是我的結構是這樣的:

private boolean checkValidity(){ 

    // check input 1 
    try{ 
     Integer.parseInt(textField1.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input 1 is invalid!"); // own implemented dialog 
     return false; 
    } 

    // check input 2 
    try{ 
     Integer.parseInt(textField2.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input 2 is invalid!"); // own implemented dialog 
     return false; 
    } 

    // (...) 

    // check input n 
    try{ 
     Integer.parseInt(textField_n.getText()); 
    }catch (NumberFormatException e){ 
     new ErrorDialog("input n is invalid!"); // own implemented dialog 
     return false; 
    } 
    return true; 
} 

這工作正是我想要的,但代碼本身是非常難看,因爲有多種輸入選擇的方法獲取長度爲200,300或更多(因爲我不僅檢查它是否是一個數字,而且如果該數字在程序邏輯等情況下是有意義的)。是否有Swingown方法來檢查這些事情?或者有誰更好的想法如何用分割方法實現這個功能?

回答

15

一個解決方案是使用Swing的InputVerifier來驗證每個使用的JTextField的輸入。作爲驗證功能是爲每個字段相同,一個單一實例可用於所有組件:

public class MyNumericVerifier extends InputVerifier { 
    @Override 
    public boolean verify(JComponent input) { 
     String text = ((JTextField) input).getText(); 
     try { 
      Integer.parseInt(text); 
     } catch (NumberFormatException e) { 
      return false; 
     } 

     return true; 
    } 
} 

InputVerifier verifier = new MyNumericVerifier() 
textField1.setInputVerifier(verifier); 
+0

+1不錯的方法使用:) –

2

有很多事情可以做。一個簡單的方法是有一個方法來檢查字符串列表的可分析性爲int。對於額外的檢查,你會有更多的方法來檢查一些典型的東西,比如數字範圍。因此,將每種支票分成自己的方法,並根據需要進行組合。

否則有完整的驗證框架來處理這類事情。他們是易於使用的,我會說。

6

我更喜歡使用的JFormattedTextField的改進版本。通過改進,我的意思是更好的脫字符行爲,驗證每個更改以提供即時用戶反饋(例如,當輸入無效時更改背景顏色),...。這與一個被禁用的按鈕結合,直到輸入有效。

在「單擊該按鈕並看到錯誤消息出現」主要優點:

  • 用戶。如果Web的應用程序可避免往返到服務器,並使用JavaScript即時反饋即時反饋,在桌面應用程序中沒有這樣的藉口。按一個按鈕來驗證是'90。
  • 視覺反饋很重要,而且更好的是InputVerifier,它只是避免了更改焦點
  • 高度可重用的組件。只要確保你的效用代碼包「中包含了一堆Format S(日期,雙打,整數,範圍,......),你可以處理幾乎任何情況
  • 由於使用的Format S,方便可調不同的Locale s
  • 你永遠不需要解析JFormattedTextField之後的輸入。所有解析代碼都包含在格式中,您可以簡單地使用JFormattedTextField#getValue
  • 所有驗證都由JFormattedTextField負責。你知道你檢索使用getValue值是一個有效的
+1

+1必須說沒有人認爲任何人都可以頂部'InputVerifier' :)完全忘記'JFormattedTextField' –

1

您可以通過使用獲得實時驗證一個DocumentFilter

你看看thisthis的一些例子。

但我的確認爲,在這種情況下,您可能會發現JFormattedTextField是更合適的解決方案。