首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DocumentFilter.FilterBypass

使用DocumentFilter.FilterBypass
EN

Stack Overflow用户
提问于 2012-02-19 09:13:02
回答 2查看 10.1K关注 0票数 2

我想在我的DocumentFilter上有一个这样的方法

代码语言:javascript
复制
public void replaceUpdate(int offset, int length, String text) {
        try {
            super.replace(byPass, offset, length, text, null);
        } catch (BadLocationException ex) {
            //error
        }
}

目前,为了获取FilterBypass的一个实例(上面方法上的byPass),我需要从被覆盖的方法insertString中获取:

代码语言:javascript
复制
private FilterBypass byPass;

@Override
    public void insertString(DocumentFilter.FilterBypass fb,
            int offset, String string, AttributeSet att)
            throws BadLocationException {
        byPass = fb;
        //some stuff here
        super.insertString(fb, offset, string, att);
    }

但这给我带来了一些问题。有没有人能推荐一些不同的获得FilterBypass的方法?我找不到一种方法以不同的方式获得对FilterBypass的引用。

如果我要重写它的方法,应该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-19 11:22:58

例如,这里有一个带有DocumentFilter的SSCCE,它阻止用户在文档中键入数字,但允许Swing计时器这样做。

代码语言:javascript
复制
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.text.*;

public class DocFilterPanel extends JPanel {
   private JTextArea textArea = new JTextArea(12, 50);
   private MyDocFilter myDocFilter = new MyDocFilter();

   public DocFilterPanel() {
      ((PlainDocument) textArea.getDocument()).setDocumentFilter(myDocFilter);
      int vsbPolicy = JScrollPane.VERTICAL_SCROLLBAR_ALWAYS;
      int hsbPolicy = JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;
      add(new JScrollPane(textArea, vsbPolicy , hsbPolicy));

      int timerDelay = 1000;
      new Timer(timerDelay , new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            myDocFilter.setFilter(false);
            textArea.append("12345\n");
            myDocFilter.setFilter(true);
         }
      }).start();
   }

   private static void createAndShowGui() {
      DocFilterPanel docFilterPanel = new DocFilterPanel();

      JFrame frame = new JFrame("DocFilterTest");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(docFilterPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyDocFilter extends DocumentFilter {
   private static final String REMOVE_REGEX = "\\d";
   private boolean filter = true;

   public boolean isFilter() {
      return filter;
   }

   public void setFilter(boolean filter) {
      this.filter = filter;
   }

   @Override
   public void insertString(FilterBypass fb, int offset, String text,
         AttributeSet attr) throws BadLocationException {
      if (filter) {
         text = text.replaceAll(REMOVE_REGEX, "");
      }
      super.insertString(fb, offset, text, attr);

   }

   @Override
   public void replace(FilterBypass fb, int offset, int length, String text,
         AttributeSet attrs) throws BadLocationException {
      if (filter) {
         text = text.replaceAll(REMOVE_REGEX, "");
      }
      super.replace(fb, offset, length, text, attrs);

   }
}
票数 10
EN

Stack Overflow用户

发布于 2014-03-06 22:25:20

我喜欢@气垫船的解决方案,但它给我带来了并发问题。我通过同步文本区域上的过滤器切换解决了这个问题。如下所示:

代码语言:javascript
复制
synchronized (textArea) {
    myDocFilter.setFilter(false);
    textArea.append("12345\n");
    myDocFilter.setFilter(true);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9345750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档