2015-07-03 33 views
-1

我正在制作GUI。用户以整数形式输入年份,并在GUI上显示该年份。但问题是我只想从用户输入4个整数。如果用户输入5个整数值,则显示JOptionPane消息,请再次输入。但我不知道该怎么做。

代码:Java Swing TextField整数值问题

public class A extends JFrame{ 


    private JTextField tx; 
    private JLabel year; 
    private JButton bt; 
    private JLabel at; 


    public A(){ 
     super("Frame"); 


     getContentPane().setLayout(null); 


     tx= new JTextField(); 
     tx.setBounds(150, 165, 128, 27); 
     getContentPane().add(tx); 

     year= new JLabel("Enter Year :"); 
     year.setBounds(178, 133, 69, 27); 
     getContentPane().add(year); 


     at= new JLabel(); 
     at.setFont(new Font("Tahoma", Font.PLAIN, 17)); 
     at.setBounds(165, 295, 189, 27); 
     getContentPane().add(at); 


     bt= new JButton("Submit"); 
     bt.setBounds(178, 203, 84, 27); 
     getContentPane().add(bt); 
     bt.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0) { 

       String w = tx.getText(); 
       int p = Integer.parseInt(w); 

       at.setText(""+p); 

      } 

     }); 

     setSize(450,450); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setVisible(true); 


    } 

} 

主要

public class Main { 

    public static void main(String[] args) { 

     A obj = new A(); 


    } 

} 
+0

转换使用将String.valueOf(整数对象),然后检查字符串的长度的整数串... –

+0

使用'DocumentFilter'用于此目的的同时解决两个一样的东西。首先要[只允许JTextField中的数字](http://stackoverflow.com/a/9478124/1057230)和[设置最大字符数量](http://stackoverflow.com/a/8883693/1057230),可以插入 –

+0

@nIcE cOw可以请你给我一个代码如何实现这个程序 – hamel123

回答

0
String w = tx.getText(); 
      int p = Integer.parseInt(w); 

      String e=String.valueOf(w); 
    int m = e.length(); 
    System.out.println(m); 

    if(e.length()==4){ 


      at.setText(""+p); 
    } 
    else{ 
     JOptionPane.showMessageDialog(null, "Wrong"); 
    } 
     } 

    }); 

家伙做这个东西是好的初步实践

1

只是不要让他们在进入超过400个字符

tx.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyTyped(KeyEvent e) { 
      if (tx.getText().length() >= 4) { 
       e.consume(); 
      } 
     } 
    }); 

然后,您也扩展为首位确保他们只输入数字

tx.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyTyped(KeyEvent e) { 
      if (tx.getText().length() >= 4 || !Character.isDigit(e.getKeyChar())) { 
       e.consume(); 
      } 
     } 
    }); 
+0

不是DocumentListener /过滤器和通过使用带有SpinnerDateModel的JSpinner来简化 – mKorbel

1

总之,如果用户输入一个有效的一年要检查。 在这种情况下,逻辑方法会更好。实际情况下,每个应用都有一定的用户年份范围。你可以做那样的事情。

String w = tx.getText(); 
int p = Integer.parseInt(w); 
int lower_limit = 1960; 
int upper_limit = 2050; 
if(p>lower_limit && p<uppper_limit){ 
    at.setText(""+p); 
} 

但最好的方法是使用JSpinner。它适合于这个目的。

注:如果你真的希望所有的4位数字的年份,分别10000999更换upper_limitlower_limit

+1

而不是带有SpinnerDateModel的JSpinner – mKorbel

2

以下是代码,供您快速查看,但请在将来尝试自行实施。

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 
import javax.swing.text.DocumentFilter.FilterBypass; 

public class MyDocumentFilterExample { 

    private static final int MAX_CHARACTERS = 4; 
    private JTextField tField; 

    private void displayGUI() { 
     JFrame frame = new JFrame("Input Integer Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     tField = new JTextField(10); 
     ((AbstractDocument)tField.getDocument()).setDocumentFilter(
       new MyDocumentFilter (MAX_CHARACTERS));   
     contentPane.add(tField); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main (String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new MyDocumentFilterExample().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater (runnable); 
    } 
} 

class MyDocumentFilter extends DocumentFilter { 

    private int max_Characters; 
    private boolean DEBUG; 

    public MyDocumentFilter(int max_Chars) { 
     max_Characters = max_Chars; 
     DEBUG = false; 
    } 

    public void insertString(FilterBypass fb 
            , int offset 
            , String str 
            , AttributeSet a) 
            throws BadLocationException { 
     if (DEBUG) { 
      System.out.println("In DocumentSizeFilter's insertString method"); 
     } 
     int length = fb.getDocument().getLength() + str.length(); 
     if (length <= max_Characters && isValid (str)) 
      super.insertString(fb, offset, str, a); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 

    public void replace(FilterBypass fb 
          , int offset, int length 
          , String str, AttributeSet a) 
           throws BadLocationException { 
     if (DEBUG) { 
      System.out.println("In DocumentSizeFilter's replace method"); 
     } 
     int len = fb.getDocument().getLength() + str.length(); 
     if (len - length <= max_Characters && isValid (str)) 
      super.replace(fb, offset, length, str, a); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 

    private boolean isValid (String string) { 
     int len = string.length(); 
     boolean isValidInteger = true; 

     for (int i = 0; i < len; i++) 
     { 
      if (!Character.isDigit(string.charAt(i))) 
      { 
       isValidInteger = false; 
       break; 
      } 
     } 
     return isValidInteger; 
    } 
} 
+1

好方法,:-)使用SpinnerDateModel的JSpinner – mKorbel