找出是否在jTextPane中的某个位置有一个特定的char [java]

时间:2016-03-22 22:54:28

标签: java swing jtextpane jdk1.6

我正在为jTextPane的getActionMap写一个动作,当我输入')'如果在Caret位置,有一个')'动作覆盖符号,ELSE通常键入')。 这是代码:

    Action action1 = new AbstractAction() {


                @Override
                public void actionPerformed(ActionEvent e) {

                    char bracket = ')';
                    try {
                            int position = jTextPane1.getCaretPosition();
                            if (jTextPane1.getDocument.getText(position,1)== ")") {
                                jTextPane1.getDocument().remove(position, 1);
                                jTextPane1.getDocument().insertString(position, ")", null);
                            } else {
                                jTextPane1.getDocument().insertString(position, ")", null);

                            }

                   } catch (Exception e1) {}
                }

            };


            String key1 = "typed )";
            jTextPane1.getInputMap().put(KeyStroke.getKeyStroke(key1), key1);
            jTextPane1.getActionMap().put(key1, action1);
        }

我无法理解为什么,即使是'如果'的布尔值。是的,它不是以if方式进行的。你能救我吗?

2 个答案:

答案 0 :(得分:2)

所以,这是一个DocumentFilter的简单示例,当用户尝试添加)字符时,过滤器会检查其前面的字符是否也是)并且基本上拒绝更新

public class TestPane extends JPanel {

    public TestPane() {
        setLayout(new BorderLayout());
        JTextPane tp = new JTextPane();
        add(new JScrollPane(tp));

        ((AbstractDocument) tp.getDocument()).setDocumentFilter(new DocumentFilter() {
            @Override
            public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
                super.insertString(fb, offset, string, attr);
            }

            @Override
            public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException {
                System.out.println("Remove");
                super.remove(fb, offset, length);
            }

            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                if (offset > 0) {
                    String before = fb.getDocument().getText(offset - 1, 1);
                    if (!(")".equals(before) && ")".equals(text))) {
                        super.replace(fb, offset, length, text, attrs);
                    }
                } else {
                    super.replace(fb, offset, length, text, attrs);
                }
            }

        });
    }

}

虽然插入的字符为)时我可以添加(,但它会将插入符移到)之后,这不是特别有帮助的< / p>

答案 1 :(得分:2)

  

即使'if'的布尔值为true,它也不会以if方式进入

您是否进行了任何基本调试以了解发生了什么?

if (jTextPane1.getDocument.getText(position,1)== ")") {

问题是你不应该使用“==”进行对象比较。它永远不会成真。

您应该使用equals(...)方法:

通过简化代码和添加调试语句可以轻松验证这一点。

String text = jTextPane1.getDocument().getText(position, 1); 
System.out.println(text);

if (text.equals(")"))
{
    System.out.println("matches");
}
else
{
    System.out.println("doesn't match");
}

使用上面的简单代码,您可以轻松验证文本值是否符合您的预期。不要用多种方法编写复杂的语句。将代码简化为多个语句使调试变得更加容易。