2013-08-07 111 views

回答

2

,如果你想只數試試這個代碼在你被inputed textfield

txtfield.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     char c = e.getKeyChar(); 
     if (!((c >= 0) && (c <= 9) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) { 
      getToolkit().beep(); 
      e.consume(); 
     } 
    } 
}); 

粘貼上面的代碼在構造函數後txtfield初始化

也看看這個東西JFormattedTextField for Double still takes characters

+0

糟糕的做法。如何粘貼錯誤的內容? – StanislavL

+1

我可以用'Character.isDigit(c)'來代替'(c> = 0)&&(c <= 9)'嗎? – dic19

+0

-1這種方法存在許多問題。小數點或負號是什麼(但不是兩者的倍數,它們必須在合理的地方)? – splungebob

3

使用帶有NumberFormat的JFormattedTextField(請參閱for example)。另外,您可以自己DocumentFilter添加的文件你JTextField

2

請告訴我如何做到這一步一步來。

  1. 使用的JFormattedTextField用的NumberFormatter

    • 限制小數

    • 設置各種RoundingModes

    • 限制範圍內,設定最小和/或最大值

    • 的數
  2. 另一種方式是使用JSpinner的與SpinnerNumberModel的,但使用的DocumentFilter

例如

import java.awt.*; 
import java.awt.font.TextAttribute; 
import java.math.*; 
import java.text.*; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.JFormattedTextField.*; 
import javax.swing.event.*; 
import javax.swing.text.InternationalFormatter; 

public class DocumentListenerAdapter { 

    public DocumentListenerAdapter() { 
     JFrame frame = new JFrame("AbstractTextField Test"); 
     final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01)); 
     textField1.setFormatterFactory(new AbstractFormatterFactory() { 
      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes(); 
     attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); 
     final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01)); 
     textField2.setFormatterFactory(new AbstractFormatterFactory() { 
      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     textField2.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      private void printIt(DocumentEvent documentEvent) { 
       DocumentEvent.EventType type = documentEvent.getType(); 
       double t1a1 = (((Number) textField2.getValue()).doubleValue()); 
       if (t1a1 > 1000) { 
        Runnable doRun = new Runnable() { 
         @Override 
         public void run() { 
          textField2.setFont(new Font(attributes)); 
          textField2.setForeground(Color.red); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } else { 
        Runnable doRun = new Runnable() { 
         @Override 
         public void run() { 
          textField2.setFont(new Font("Serif", Font.BOLD, 16)); 
          textField2.setForeground(Color.black); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.NORTH); 
     frame.add(textField2, BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       DocumentListenerAdapter main = new DocumentListenerAdapter(); 
      } 
     }); 
    } 
}