私は近日中に予定されている今後のプロジェクトのためにJTextPanesのユーザーを実験しています。オンラインでさまざまな記事がオンラインで表示されています。テキストペインしかし、私が見つけた解決策は、テキストペインのドキュメントにアイコンやコンポーネントを挿入すると失敗するようです。JTextPane行数アイコンとコンポーネントを含む
私はそれは、プレーンテキストのために働いたソリューションは、(もちろん実装溶液で)この1た:BadLocationException when using Utilities.getRowStart On hit of Enter key
しかし、私はコンポーネント(JLabelの)またはそのことについては、プレーンのアイコンを挿入しようとしたら、ユーティリティーのgetRowStart()メソッドは、NULLポインター例外をスローします。私が珍しいことは、Java Docは "...これは関連するドキュメントでコンテンツの1文字の属性として表現されている"と述べていますので、他の文字として扱うことにしましたが、そうではありません。
誰かが試してみたい問題を再現するコード例が含まれています。私はそれが単に不可能であるという気持ちがありますが、それは残念です。
import java.awt.Dimension;
import java.awt.Image;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;
public class Test{
private JFrame frame;
private JTextPane textPane;
private Image img;
private URL imgURL;
public Test(){
frame = new JFrame();
frame.setSize(new Dimension(500,300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textPane = new JTextPane();
try {
imgURL = new URL("http://www.freeiconspng.com/uploads/floppy-save-icon--23.png");
img = ImageIO.read(imgURL);
JLabel label = new JLabel(new ImageIcon(img.getScaledInstance(10, 10, Image.SCALE_SMOOTH)));
textPane.insertComponent(label);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
frame.getContentPane().add(textPane);
frame.setVisible(true);
}
public JTextPane getTextPane(){
return this.textPane;
}
public int getLineCount(){
int totalCharacters = textPane.getDocument().getLength();
int lineCount = (totalCharacters == 0) ? 1 : 0;
try {
int offset = totalCharacters;
while (offset > 0) {
offset = Utilities.getRowStart(textPane, offset) - 1;
lineCount++;
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return lineCount;
}
public static void main(String[] args){
Test t = new Test();
t.getLineCount();
}
}
[ 'EventQueue.invokeLater()'](http://docs.oracle.com/ javase/7/docs/api/java/awt/EventQueue.html#invokeLater(java.lang.Runnable))呼び出し。この問題を解決するように思われたああ、そうです。つまり、 'EventQueue.invokeLater(new runnable(){@Override public void run(){test t = new Test(); t.getLineCount();}});' –
感謝! – samcp20
@ samcp20 [Text Utilities](https://tips4java.wordpress.com/2008/10/26/text-utilities/)をチェックしてみてください。これは 'getLines()'メソッドを含みます。このメソッドは、テキストコンポーネントAPIを使って行数を取得します。私は挿入されたコンポーネントでそれを試したことはありませんが、コードははるかに簡単であることを認めなければなりません。 – camickr