首页 > 解决方案 > 在单个类中重复“替换”方法

问题描述

我发现自己遇到了障碍。我正在开发一个我拥有的计算器项目,其中一个对象是 JFormattedTextField,但我认为我们可以将它称为“文本字段”。在提到的对象中,我想只允许在其中输入数字,并且对可以输入的数字进行限制。

所以我创建了 CalculatorsFilter 类,并在其中创建了运行我想要的两个目标的代码,因此我们可以将类分隔为数字过滤器:

public class CalculatorsFilter extends DocumentFilter {
        @Override
        public void insertString(FilterBypass fb, int offset, String text, 
                AttributeSet attr) throws BadLocationException {
            super.insertString(fb, offset, revise(text), attr);
        }

        public void replace(FilterBypass fb, int offset, int length, String text,
                            AttributeSet attrs) throws BadLocationException {
            super.replace(fb, offset, length, revise(text), attrs);
        }

        private String revise(String text) {
            final StringBuilder builder = new StringBuilder(text);
            int index = 0;
            while (index < builder.length()) {

                if (accept(builder.charAt(index))) {
                    index++;

                } else {

                    builder.deleteCharAt(index);

                }
            }

            return builder.toString();
        }

        public boolean accept(final char c) {
            return Character.isDigit(c) || c == '.' || c == '-' || c == '+';
        }

第二部分,即极限“创造者”:

 private final int numlimit;

        public CalculatorsFilter(int limit) {
                 if (limit <= 0) {
                     throw new IllegalArgumentException("The number limit can not be <= 0");
                 }
                 this.numlimit = limit;
        }

             public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                 final int currentLength = fb.getDocument().getLength();
                 final int overLimit = (currentLength + text.length()) - numlimit - length;
                 if (overLimit > 0) {
                     text = text.substring(0, text.length() - overLimit);
                 }
                 if (text.length() > 0) {
                     super.replace(fb, offset, currentLength, text, attrs); 
                 }
        }
}

您可能已经注意到,这里的问题是我在同一个类中有相同的方法,即方法 replace()。当然,正如我实际预期的那样,它会给出一条错误消息。但是,如果我尝试将其中一个重命名为“replace1”,即使错误消息消失,重命名的方法也将不再起作用。我尝试过的另一个解决方案似乎是最简单的,只需为我想要的每个过滤器创建另一个类。然而,再次,障碍是我不能使用......

//intField is the JFormattedTextField.
intField.setDocumentFilter();

在我的 Main 类上两次,这意味着我不能对每个过滤器使用一个类。我在尝试修复时是否做错了什么,或者有没有办法在不影响其中一个的情况下解决重复的方法错误?

标签: javamethodsdocumentfilter

解决方案


推荐阅读