2014-04-20 2 views
2

jtextarea 및 문서 필터를 사용하고 있습니다. 나는 사용자가 "b"를 누르 자마자, 전체 텍스트가 삭제되기를 원한다. 단, 첫 글자를 제외하고 말이다. 이것을 어떻게 할 수 있습니까? 몇 가지 아이디어가 유용 할 것입니다. 내가있어 DocumentListener를 사용JTextArea 및 DocumentFilter

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); 
    } 

덕분에 많은

답변

4

당신은 length을 통과 오프셋 0 (문서의 시작 부분)로 설정 사용하고, 문서의 길이를 사용할 수 있으며 장착 할 텍스트는 아무것도 ""

@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); 
    } 
+0

답장을 보내 주셔서 감사합니다. 그러나 이것을 테스트하고 b를 누르면 첫 글자 D를 포함하여 전체 텍스트가 지워집니다. –

+0

if 문에'&& fb.getDocument(). getLength()> 0 '을 그냥 추가하십시오. 나는 당신의 질문의 그 부분을 잡지 않았다 :) –

+0

잠깐, 그래서 b를 누르면, 첫 번째 글자를 제외하고 모두 삭제되기를 원합니까? 아니면 b가 첫 글자라면 괜찮습니까? –

1

이 작동합니다 :

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) { 
      // 
     } 
    } 
}