2012-01-16 2 views
3

다음 문제가 발생했습니다 :JTextPane의 캐럿 위치가 올바르지 않습니다. 버그 또는 예상되는 동작?

구성 요소의 캐럿 위치에있는 JTextComponent 문서의 문자를 읽고 싶습니다. JTextPane을 사용할 때 캐럿 위치에서 반환 된 문자가 올바르지 않습니다. 좀 더 자세히 설명하자면 문자는 캐럿 위치에서 줄 수를 뺀 것입니다. (캐럿 위치 - 현재 행 번호). 반면에 내가 JTextArea를 사용할 때 결과는 정확합니다 ... 이걸 보여주기 위해 당신이 가지고 놀 수있는 샘플 프로그램을 구현했습니다.

그래서 큰 질문은 JTextPane의 경우 캐럿 위치의 특성을 어떻게 얻을 수 있습니까?

JTextPane가 JTextArea와 같은 캐럿 위치를 반환하지 않는 이유와, JTextPane에 의해 반환 된 문자가 화면에서 볼 수있는 문자가 아닌 이유를 자세히 설명합니다. 설명 된 동작이 버그입니까? 아래에서

는 JTextPane가 사용하기 매우 재미 있고 예기치 않은 결과

의 샘플 프로그램의 코드뿐만 아니라 스크린 샷을 찾을 수 있습니다. CARET 위치 17의 문자는 e입니다. 아니 ...

alt text http://img405.imageshack.us/img405/2746/jtextpane.jpg

Usign JTextArea에

. 여기에 전과 같은 위치에 캐럿이 있습니다. 그러나 이제 캐럿 위치 20을 얻었고 반환 문자는 \ r \ n입니다 (예상 한 것과 함께).

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.*; 
import java.awt.event.*; 

public class Example extends JFrame { 
// use this instead of JTextPane to see the difference 

// JTextComponent testingArea = new JTextArea(5,10); 
    JTextComponent testingArea = new JTextPane(); 
JButton button = new JButton("test"); 
JTextComponent resultArea = new JTextField(20); 


public Example() { 
    initialise(); 
    testingArea.setText("line1\r\nline2\r\nline3\r\nline4"); 
} 


private void initialise() { 
    testingArea.setPreferredSize(new Dimension(100,100)); 
    setLayout(new FlowLayout()); 
    getContentPane().add(testingArea); 
    getContentPane().add(new JLabel("answer")); 
    getContentPane().add(resultArea); 
    getContentPane().add(button); 
    button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       int caretPosition = testingArea.getCaretPosition(); 
       char result = testingArea.getText().charAt(caretPosition); 
       resultArea.setText("Char at caretPosition " + caretPosition + " is " + result); 
      }catch (Exception e2) { 
       e2.printStackTrace(); 
       resultArea.setText("ERROR"); 
      } 

     } 
    }); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

public static void main(String[] args) { 
    final Example ex = new Example(); 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      ex.pack(); 
      ex.setVisible(true); 

     } 
    }); 
} 
} 

감사를 도움 :

다음 alt text http://img809.imageshack.us/img809/5323/jtextarea.jpg

은이 이상한 행동을보고 놀 수있는 코드입니다!

PS 내가 사용하고 자바는 6

+0

감사합니다 (alain.janinm, StanislavL). – Pitelk

답변

5

사용은 내가 JTextPane의 EOL 생각

char result = testingArea.getDocument().getText(caretPosition,1).charAt(0); 

보다는

char result = testingArea.getText().charAt(caretPosition); 
5

은 (\ n 내 생각)에있는 반면 한 문자로 계산됩니다 JTextArea 2로 계산됩니다 (\ r \ n).

Oracle 설명서는 말한다 :

JEditorPane의 클래스는 스윙의 스타일 텍스트 구성 요소의 기반이며 사용자 정의 텍스트 형식에 대한 지원을 추가 할 수있는 메커니즘을 제공합니다. 당신이 unstyled 텍스트를 원한다면, 텍스트 영역을 대신 사용하십시오.

그래서 텍스트 영역은 주어진 텍스트에만 적용되므로 모든 입력 문자가 중요합니다. JEditorPane는 EOL가 해석 될 수 있도록 StyledDocument를 사용했습니다.

+1

당신이 옳습니다; Windows CR + LF 문자 대 추상적 인 end-of-line 문자. –

관련 문제