2013-12-14 25 views
4

我需要做下面的格式爲「00:00」的一些要求的JFormattedTextField:的JFormattedTextField特定格式

  • 唯一改變的應該是在「00」。 (所以「:」不應該是可刪除的)
  • 選項卡讓您在「:」兩邊之間切換。 (因此,將光標置於一側並且掛鉤標記在另一側上都爲「00」)
  • 將「00」更改爲「2」應將其格式化爲「02」。
  • 它的字符限制應該是5,包括「:」。 (4個可改變的字符)
  • 它應該被初始化爲「00:00」,但它不應該是一個可接受的輸入。
  • 您應該無法輸入除數字以外的任何內容。 (字母,符號,負數等)

有沒有辦法做到這一點?我查看了不同的格式化器,驗證器和文檔過濾器以添加到JFormattedTextField中,但我不確定要使用哪些格式器。 (現在使用DefaultFormatter,但是已經查看了NumberFormatter的限制,我需要使用格式化程序和驗證程序的組合嗎?)

這是我現在的JFormattedTextField:http://pastebin.com/jW2RSJXe [1]。

任何來自代碼的代碼,它可以幫助您查看示例/指針,我們將不勝感激!

+1

我不認爲第2部分是可以實現的。你可以看看[這個時間字段](http://stackoverflow.com/questions/11881301/best-way-to-constrain-user-to-enter-a-time-in-a-jtextfield/11881681# 11881681)哪個作弊並使用兩個文本字段 – MadProgrammer

回答

2

運行此示例。它使用了一個MaskFormatter。該:是永久存在的,但我不知道如何格式化你的問題的另一部分:如果你只有2個,它會顯示02你可以玩它

import java.awt.BorderLayout; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.text.MaskFormatter; 

public class MaskFormatterTest extends JPanel { 

    private JFormattedTextField formatText; 

    public MaskFormatterTest() { 
     formatText = new JFormattedTextField(createFormatter("##:##")); 
     formatText.setColumns(20); 
     formatText.setText("00:00"); 

     setLayout(new BorderLayout()); 
     add(new JLabel("Enter only numbers"), BorderLayout.NORTH); 
     add(formatText, BorderLayout.CENTER); 
    } 

    private MaskFormatter createFormatter(String s) { 
     MaskFormatter formatter = null; 
     try { 
      formatter = new MaskFormatter(s); 
     } catch (java.text.ParseException exc) { 
      System.err.println("formatter is bad: " + exc.getMessage()); 
      System.exit(-1); 
     } 
     return formatter; 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("MaskFormatter example"); 
       frame.add(new MaskFormatterTest()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationByPlatform(true); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

MaskFormatter套每個位置的每個字符的類型值和允許的大小。在這種情況下,我使用了##:##。允許兩位數字,冒號和兩位數字。

更新:增加了formatText.setText("00:00");來代碼來初始化文本字段。

+0

謝謝!這讓我非常接近我正在尋找的東西! 你有沒有什麼好的地方可以閱讀關於MaskFormatter或Formatter的一般信息? – user3101783

+0

查看[教程](http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#maskformatter)和[javadoc](http://docs.oracle.com/javase/ 7 /文檔/ API /的javax /擺動/文本/ MaskFormatter.html)。 –