2012-01-16 9 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

は、あなたがこの奇妙な動作を確認すると遊ぶことができるコードです!中のに対し、私はJTextPaneのEOLで考える私は、Java 6

+0

貴重な回答をいただきありがとうございます(alain.janinm、StanislavL)。 – Pitelk

答えて

5

使用

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

ではなく

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

を使用しています

PSは、1つの文字(\ nは私が思う)としてカウントされますJTextArea 2(\ r \ n)として数えられます。

Oracleのドキュメントは言う:

JEditorPaneのクラスはSwingのスタイルテキストコンポーネントの基盤であり、あなたがカスタムテキスト形式のサポートを追加することができますするメカニズムを提供します。スタイルのないテキストが必要な場合は、代わりにテキスト領域を使用します。

したがって、テキスト領域は指定されたテキストのみに基づいているため、すべてのエントリ文字がカウントされます。 JEdi​​torPaneは、EOLが解釈されるようにStyledDocumentを使用しました。

+1

あなたは正しいです。 Windows CR + LFの文字列と抽象的な行末の比較 –

関連する問題