当前位置: 首页 > 知识库问答 >
问题:

强制JTextField为字符串值,而DocumentFilter只允许数字

宣滨海
2023-03-14

我正在开发一个Java应用程序,遇到了一个我自己似乎无法解决的问题。

我在JTextField上设置了DocumentFilter,只允许数字输入,但是默认值是文本。我有一个按钮,可以将JTextFields重置为默认值,但由于DocumentFilter的原因,它无法正常工作。

我怎样才能克服这个问题?

谢啦

共有3个答案

南门宇
2023-03-14

你可以使用一些类似PromptSupport的东西

或者是Text Prompt类。它类似于PromptSupport,但可以在常规JTextField上使用,因此您不需要整个SwingX项目。

韩捷
2023-03-14

用户只能在其中输入数字数据,但还需要显示非数字值的字段是矛盾的。

文本是通过文档提供给字段的,无论是由用户还是以编程方式生成,都没有区别。

如果您试图在字段中显示“提示”,可以查看SwingLabs SwingX库中的PromptSupport

例如

当字段具有焦点时,“提示”将被隐藏,但您可以控制它,使其显示,直到用户键入某些内容或在获得焦点时突出显示。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.jdesktop.swingx.prompt.BuddySupport;
import org.jdesktop.swingx.prompt.PromptSupport;

public class PromptSupportTest {

    public static void main(String[] args) {
        new PromptSupportTest();
    }

    public PromptSupportTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JTextField firstName = new JTextField(10);
            PromptSupport.setPrompt("First Name", firstName);
            PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, firstName);

            JTextField lastName = new JTextField(10);
            PromptSupport.setPrompt("Last Name", lastName);
            PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, lastName);

            JTextField picture = new JTextField(10);
            PromptSupport.setPrompt("Picture", picture);
            PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, picture);

            JButton browse = new JButton("...");
            browse.setMargin(new Insets(0, 0, 0, 0));
            browse.setContentAreaFilled(false);
            browse.setFocusPainted(false);
            browse.setFocusable(false);
            browse.setOpaque(false);
            // Add action listener to brose button to show JFileChooser...

            BuddySupport.addRight(browse, picture);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;

            add(firstName, gbc);
            add(lastName, gbc);
            add(picture, gbc);

            gbc.anchor = GridBagConstraints.CENTER;
            add(new JButton("Ok"), gbc);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

我还添加了一个BuddySupport的示例,它是同一个API的一部分,允许您将另一个组件与文本组件“配对”。在这里,我做了经典的“文件浏览器”组合,但我一直在做这样的“搜索”样式的字段。。。

施利
2023-03-14

做一件事:

将默认文档存储在某个位置

final JTextField textField = new JTextField();
final Document defaultDocument=textField.getDocument();

单击按钮,首先将文档设置回默认值以禁用文本字段上的验证,然后设置默认文本

 btn.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        textField.setDocument(defaultDocument);
        textField.setText("hi");
    }
});

在文本字段的焦点上再次添加文档过滤器,以验证用户输入。

请看看如何在Java(JTextField类)中实现只允许输入数字?。

--编辑--

您可以通过在文本字段上添加焦点侦听器来实现。

如果文本字段中的值为空,则将默认值设置回提示。无需点击按钮即可完成。

以下是代码:

    final JTextField textField = new JTextField("First Name");

    final Document defaultDocument = textField.getDocument();

    final PlainDocument doc = new PlainDocument();
    doc.setDocumentFilter(new DocumentFilter() {
        @Override
        public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
                throws BadLocationException {
            fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove
                                                                     // non-digits
        }

        @Override
        public void replace(FilterBypass fb, int off, int len, String str,
                AttributeSet attr) throws BadLocationException {
            fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove
                                                                     // non-digits
        }
    });

    textField.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent e) {
            System.out.println("focus lost");
            if(textField.getText() == null || textField.getText().trim().length()==0){
                textField.setDocument(defaultDocument);
                textField.setText("First Name");
            }
        }

        @Override
        public void focusGained(FocusEvent e) {
            System.out.println("focus gained");
            textField.setDocument(doc);
        }
    });
 类似资料:
  • \这是JTextField的创建: 这是我的DocumentFilter: 这会自动从JTextField中删除所有字母和字符。 然而,我想知道是否有人知道有一个地方的所有命令都类似于“\D”。我花了一段时间才找到正确的信息。 另外,我现在的代码也可以防止。当我和替身一起工作时,我需要的那种类型。有什么想法吗? 谢谢!我今天学到了这么多,真是太神奇了。我已经连续编码了13个小时。

  • 问题内容: 我在这里的研究中得到了不同的答案。 有人可以验证Redis服务器只能存储任何数值的表示吗? 例如,如果我在lpush中使用具有双重类型的Java客户端(Jedis),在发送给Redis之前是否需要将其转换为等效于字符串类型的内容? 还是有一种方法可以发送诸如double之类的实际数字类型?如果是这样,是否有任何示例代码说明了如何实现此目的? 谢谢 问题答案: Redis将所有内容存储在

  • 问题内容: 我正在尝试创建数学测验,我只希望用户能够输入数字,无论它们是负数还是正数。有什么办法吗?我曾经考虑过使用正则表达式,但听说它们不好用。我尝试使用按键侦听器,但是如果用户粘贴该怎么办?我尝试解析字符串以获取整数,但是负号将不起作用。 有任何想法吗? 问题答案: 使用DocumentFilter: NumberOnlyFilter.java: 然后您可以像这样使用它:

  • 我已经用TestNG创建了一个Selenium框架。在此框架中,@Dataprovider包含一组代码,这些代码从Excel读取数据,并将该值作为2D数组返回给@Test。 “get”方法返回字符串[]。但我得到的错误是“数据提供程序必须返回对象[]”。如果我将其更改为对象[],则我的测试用例失败,错误如下: