首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTextArea和DocumentFilter

JTextArea和DocumentFilter
EN

Stack Overflow用户
提问于 2014-04-20 09:54:29
回答 2查看 1.7K关注 0票数 1

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

代码语言:javascript
复制
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); 
    }

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-20 10:45:54

您希望使用偏移量并将其设置为0(文档的开头),并使用文档长度传递length,而要替换的文本不是""

代码语言:javascript
复制
@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);
    }  
}

完整示例

代码语言:javascript
复制
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,整个文本就会被删除,包括第一个字母

只要得到文档的第一个字母,如果您想保留第一个字母,就用它替换文本。

代码语言:javascript
复制
    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);
    }
票数 3
EN

Stack Overflow用户

发布于 2014-04-20 10:42:41

通过使用DocumentListener,我可以让它工作起来:

代码语言:javascript
复制
    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处的字符。

下面是我的完整测试用例,如果您想运行它/看看它是如何工作的:

代码语言:javascript
复制
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) {
            //
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23180781

复制
相关文章

相似问题

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