我正在使用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();
            }
        });
    }
}




编辑


  “但是,对此进行测试并按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);
    }

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

10-10 05:26