gpt4 book ai didi

java - 使用 DocumentFilter.FilterBypass

转载 作者:行者123 更新时间:2023-12-02 10:51:57 27 4
gpt4 key购买 nike

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

public void replaceUpdate(int offset, int length, String text) {
try {
super.replace(byPass, offset, length, text, null);
} catch (BadLocationException ex) {
//error
}
}

当前为了获取 FilterBypass 的实例(绕过上面的方法),我需要从重写的方法 insertString 中获取:

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 引用的方法。

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

最佳答案

例如,这里有一个带有 DocumentFilter 的 SSCCE,它可以防止用户在文档中输入数字,但允许 Swing Timer 这样做。

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);

}
}

关于java - 使用 DocumentFilter.FilterBypass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345750/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com