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

如何从DocumentFilter获取JTextfield的类型

洪富
2023-03-14

问题:我想知道是否可以从DocumentFilter获取JTextfield类型
我读过java文档,搜索了很多,但没有找到任何信息。

需要:我在两个JTextfields上设置了相同的DocumentFilter。当事件发生时,在DocumentFilter的“replace”方法中,我想知道哪个textfield导致了事件。

用例:我有大约15个文本字段(未来可能会增加),我希望对所有这些字段进行单独检查:
-输入的最大文本长度
-只需输入某些字符(这对所有文本字段都是相同的)
例如:textfield1最多可以使用10个字符,而textfield2最多可以使用5个字符。

到目前为止,我所做的是:
我为每个文本字段创建了单独的过滤器,这会导致大量冗余代码并增加处理的复杂性,以供将来使用。

期待任何帮助。:-)

共有1个答案

尉迟跃
2023-03-14

好的,现在您的需求更明确了,但是,再一次,您不能(也不应该)检查您从DocumentFilter内部输入的文本字段来决定在您的中做什么替换()方法。

可能的解决方案:创建自己的DocumentFilter类,传递所有需要的参数(最大文本长度,可能还有一个禁止字符数组,或者其他任何参数)。所有文本字段都将有一个独特的DocumentFilter实例,其参数设置将满足您的需要。这样,您将获得一个干净的解决方案,而不需要冗余代码。

例如:

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class FilterTextField
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                createAndShowGUI ();
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setContentPane (new MainPanel ());
        frame.pack ();
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
}
class MainPanel extends JPanel
{
    public MainPanel () {
        super (new GridLayout (3, 1, 0, 20));

        JTextField t1 = new JTextField (20);
        JTextField t2 = new JTextField (20);
        JTextField t3 = new JTextField (20);

        ((AbstractDocument) t1.getDocument ()).setDocumentFilter (new MyDocumentFilter (5));
        ((AbstractDocument) t2.getDocument ()).setDocumentFilter (new MyDocumentFilter (10, '!', '?'));
        ((AbstractDocument) t3.getDocument ()).setDocumentFilter (new MyDocumentFilter (15, new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}));

        add (t1);
        add (t2);
        add (t3);

        setBorder (new EmptyBorder (20, 20, 20, 20));
    }


}
class MyDocumentFilter extends DocumentFilter
{
    private char [] forbiddenCharacters;
    private int maximumLength;

    public MyDocumentFilter (int maximumLength, char ... forbiddenCharacters) {
        this.maximumLength = maximumLength;
        this.forbiddenCharacters = forbiddenCharacters;
    }
    @Override public void replace (FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        // Get the full text you would have after replacement
        Document document = fb.getDocument ();
        String fullText = new StringBuilder (document.getText (0, document.getLength ())).replace (offset, offset + length, text).toString ();
        // Check your requirements ...
        if (fullText.length () <= maximumLength) {
            if (forbiddenCharacters != null) {
                for (char c : forbiddenCharacters) if (fullText.indexOf (c) > -1) return;
            }
            // Replace method is called only if your requirements are met.
            super.replace (fb, offset, length, text, attrs);
        }
    }
}
 类似资料:
  • 我在做一个数独游戏,我有“cell”类型的9x9对象(类扩展了JTextField),我想防止在用户不符合游戏规则的情况下关注其他JTextField对象——他的输入(1-9)不会在同一行或同一个“块”。要做到这一点,我需要知道他关注的具体对象。 我正在考虑这样做的一种方法是使用DocumentFilter。我已经将输入过滤为数字和1长度,但我不知道如何获取他关注的“单元格”对象,我很确定Docu

  • 假设我有一个Jextfield数组(例如JTextfield[10])。我将它们添加到框架中。现在用户在文本字段中随机输入文本,例如用户首先输入索引为5的文本字段,然后是9,然后是2,依此类推。不一定要填充所有的文本字段。 我的问题是,如何获取文本字段的索引,并在用户输入文本时同时打印索引,这意味着如果用户在文本字段中输入索引5,我应该能够获得索引5,然后如果填充了索引9的文本字段,则打印9,依此

  • 问题内容: 在一个项目上,我通过一个类似于控制台的小窗口运行Java应用程序。由于这里有一个很棒的社区,我设法通过从流程输出数据来解决问题,但是由于没有输入流,我运行的命令行应用程序将不断出错。 基于该线程中最后一个有用的答复,我想我将以类似的方式实现该实现,但是在javadocs中以及整个google和互联网中寻找某个类,该类确实没有发现任何解释方法。 因此,我需要一些链接,示例,教程,示例代码

  • StackPane容器=fxmlLoader.load(getClass().getResource(“fxmlDocument.fxml”)等。 我如何在控制器传递中获得我的根节点或stackpane?

  • 我正在与Avro合作,我有一个通用记录。我想从中提取clientId、deviceName、holder。在Avro模式中,

  • 问题内容: 通常,我见过人们像这样使用类文字: 但是,如果类型是通用类型,例如List,该怎么办?这可以正常工作,但由于应将List参数化,因此发出警告: 那么为什么不添加一个<?>呢?好吧,这会导致类型不匹配错误: 我想像这样的事情会起作用,但这只是一个普通的语法错误: 如何获得Class >静态信息,例如使用类文字? 我可以使用,以摆脱在第一个例子中所造成的非参数使用列表,警告的,但我宁愿不要