2016-08-07 10 views
1

私は近日中に予定されている今後のプロジェクトのために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(); 
    } 
} 
+2

[ '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();}});' –

+0

感謝! – samcp20

+2

@ samcp20 [Text Utilities](https://tips4java.wordpress.com/2008/10/26/text-utilities/)をチェックしてみてください。これは 'getLines()'メソッドを含みます。このメソッドは、テキストコンポーネントAPIを使って行数を取得します。私は挿入されたコンポーネントでそれを試したことはありませんが、コードははるかに簡単であることを認めなければなりません。 – camickr

答えて

3

問題は、次のコメントの後に解決された:私はEventQueue.invokeLater()コール内 あなたのmainメソッド内でコンテンツをラップした後

は、それは私のために、例外をスローしません。すなわち:私は内部のメインメソッド内コンテンツをラップしたらそれは私のために、例外をスローしません

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     Test t = new Test(); 
     t.getLineCount(); 
    } 
}); 
関連する問題