【问题标题】:How to only allow capital letters in Java GUI?如何在 Java GUI 中只允许大写字母?
【发布时间】:2014-02-07 03:52:21
【问题描述】:

我希望能够在我的 GUI 中仅输入大写字母,因此我只需要最简单的方法来限制/阻止人们输入小写字母。

JTextField jt = new JTextField(12);

【问题讨论】:

    标签: java swing text jtextfield uppercase


    【解决方案1】:

    使用DocumentFilter

    查看Implementing a Document Filter 了解详情和MDP's Weblog 了解示例

    import java.awt.EventQueue;
    import java.awt.GridBagLayout;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    
    public class UppercaseTest {
    
        public static void main(String[] args) {
            new UppercaseTest();
        }
    
        public UppercaseTest() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JTextField field = new JTextField(20);
                    ((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() {
    
                        @Override
                        public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
                            string = string.toUpperCase();
                            super.insertString(fb, offset, string, attr);
                        }
    
                        @Override
                        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                            text = text.toUpperCase();
                            super.replace(fb, offset, length, text, attrs);
                        }
    
                    });
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new GridBagLayout());
                    frame.add(field);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    【讨论】:

    • 喜欢视频游戏的典故。 :)
    【解决方案2】:

    尝试以下方法:

     inputValue.toUpperCase();
    

    这样,您将在处理数据之前将所有内容都大写。

    【讨论】:

    • Java 不喜欢 'inputVal' 我在做什么来阻止错误??
    • 令牌“toUpperCase”的语法错误,标识符应在此令牌之后
    • inputValue 只是潜在变量的一个示例。在您的情况下,您想调用 jt.getText().toUpperCase();。我希望这可以帮助你:)
    • 我认为 OP 是在谈论预处理输入而不是后处理......但我知道什么:P
    • @BelgianMyWaffle String 是不可变的,所以它必须是 jt.setText(jt.getText().toUpperCase());
    【解决方案3】:

    DocumentFilter

    喜欢这个例子

     DocumentFilter dfilter = new UpcaseFilter();
    
            JTextField jt = new JTextField();
            ((AbstractDocument) jt.getDocument()).setDocumentFilter(dfilter);
    

    【讨论】:

      【解决方案4】:

      DocumentFilter 的另一个例子

      import java.awt.Dimension;
      import java.awt.FlowLayout;
      import java.awt.HeadlessException;
      
      import javax.swing.JFrame;
      import javax.swing.JTextField;
      import javax.swing.text.AbstractDocument;
      import javax.swing.text.AttributeSet;
      import javax.swing.text.BadLocationException;
      import javax.swing.text.DocumentFilter;
      
      public class Main extends JFrame {
        public Main() throws HeadlessException {
          setSize(200, 200);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setLayout(new FlowLayout(FlowLayout.LEFT));
      
          DocumentFilter filter = new UppercaseDocumentFilter();
      
          JTextField firstName = new JTextField(10);
          ((AbstractDocument) firstName.getDocument()).setDocumentFilter(filter);
      
          JTextField lastName = new JTextField(10);
          ((AbstractDocument) lastName.getDocument()).setDocumentFilter(filter);
      
          add(firstName);
          add(lastName);
        }
      
        public static void main(String[] args) {
          new Main().setVisible(true);
        }
      
      }
      
      class UppercaseDocumentFilter extends DocumentFilter {
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text,
            AttributeSet attr) throws BadLocationException {
      
          fb.insertString(offset, text.toUpperCase(), attr);
        }
      
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text,
            AttributeSet attrs) throws BadLocationException {
      
          fb.replace(offset, length, text.toUpperCase(), attrs);
        }
      }
      

      【讨论】:

      • 尝试使用JTextField(int) 指定文本字段的首选大小而不是setPreferredSize,因为我的字体可能与您的不同。并且因为它把人们置于这样的问题领域,演示使用正确的初始线程;)
      • 是的。我会去做的。感谢您的指导:)
      • “我会这样做的。” ..什么时候?我希望看到一个编辑,这样我就可以对这个答案投赞成票。
      【解决方案5】:

      你创建了一个 JTexfield,然后你需要添加事件 keyTyped 并添加这个代码:

      JTextField txtFirstName = new JTextField();
      txtFirstName.addKeyListener(new KeyAdapter() {
          @Override
          public void keyTyped(KeyEvent arg0) {
              char charecter = arg0.getKeyChar();
                  if (Character.isLowerCase(charecter)) {
                      arg0.setKeyChar(Character.toUpperCase(charecter));
                  }
              }
          });
      

      【讨论】:

      • 关闭,但是复制粘贴呢? ; )
      • 感谢您的反馈,我已经改进了我的回答。
      • 你测试过复制粘贴吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多