gpt4 book ai didi

java - JTextArea 和 DocumentFilter

转载 作者:行者123 更新时间:2023-11-29 03:21:46 24 4
gpt4 key购买 nike

我正在使用 jtextarea 和文档过滤器。我希望只要用户在其中按下“b”,整个文本就会被删除,除了第一个字母。我怎样才能做到这一点。有些想法会很有用。

public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if ("b".equalsIgnoreCase(text)) {
//what here???
}
super.replace(fb, offset, length, text, attrs);
}

非常感谢

最佳答案

你想用偏移量设置为0(文档开头),用文档长度传length,要替换的文本什么都不是""

@Override
public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr)
throws BadLocationException {
if ("b".equalsIgnoreCase(str)) {
super.replace(fb, 0, fb.getDocument().getLength(), "", attr);
return;
} else {
super.replace(fb, offset,length, str, attr);
}
}

完整示例

import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class TestBFilter {

public TestBFilter() {
JTextArea field = createTextArea();
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
frame.add(new JScrollPane(field));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private JTextArea createTextArea() {
JTextArea field = new JTextArea(10, 20);
field.setLineWrap(true);
field.setWrapStyleWord(true);
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr)
throws BadLocationException {
if ("b".equalsIgnoreCase(str)) {
super.replace(fb, 0, fb.getDocument().getLength(), "", attr);
return;
} else {
super.replace(fb, offset, length, str, attr);
}
}
});
return field;
}

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

编辑

"testing this however and pressing b makes the whole text to be erased, including first letter"

只要获取文档的第一个字母,如果你想保留第一个字母,就用它替换文本。

    if ("b".equalsIgnoreCase(str)) {
String text = fb.getDocument().getText(0, 1);
super.replace(fb, 0, fb.getDocument().getLength(), text, attr);
} else {
super.replace(fb, offset, length, str, attr);
}

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

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