我正在使用一个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);
}非常感谢
发布于 2014-04-20 10:45:54
您希望使用偏移量并将其设置为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();
}
});
}
}编辑
但是,测试这一点,然后按下b,整个文本就会被删除,包括第一个字母
只要得到文档的第一个字母,如果您想保留第一个字母,就用它替换文本。
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);
}发布于 2014-04-20 10:42:41
通过使用DocumentListener,我可以让它工作起来:
public void insertUpdate(DocumentEvent e) {
if (area.getText().charAt(e.getOffset()) == 'b') {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
area.setText("" + area.getText().charAt(0));
}
});
}
}在insertUpdate上,如果偏移量处的字符是b,则文本设置为索引0处的字符。
下面是我的完整测试用例,如果您想运行它/看看它是如何工作的:
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class Testgui extends JFrame
{
JTextArea area;
public Testgui()
{
super("Test Frame");
setVisible(true);
setSize(500,500);
area = new JTextArea();
area.getDocument().addDocumentListener(new DListener());
add(area);
}
public class DListener implements DocumentListener {
public void insertUpdate(DocumentEvent e) {
if (area.getText().charAt(e.getOffset()) == 'b') {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
area.setText("" + area.getText().charAt(0));
}
});
}
}
public void removeUpdate(DocumentEvent e) {
//
}
public void changedUpdate(DocumentEvent e) {
//
}
}
}https://stackoverflow.com/questions/23180781
复制相似问题