2016-08-07 1 views
1

최근에 다룰 프로젝트에 대한 JTextPanes 사용자를 실험하고 있습니다. 온라인에서 여러 줄의 수를 계산하는 방법에 대한 자세한 내용이 온라인에 있습니다. 텍스트 창 그러나 텍스트 창의 문서에 아이콘이나 구성 요소를 삽입 할 때 찾은 솔루션이 모두 실패한 것 같습니다.JTextPane 행 개수 아이콘 및 구성 요소 포함

내가 그 일반 텍스트를 한 일 (물론 구현 솔루션)이 하나 발견 해결책 : 그러나 BadLocationException when using Utilities.getRowStart On hit of Enter key

내가 컴포넌트 (JLabel의) 또는 그 문제에 대한 일반 아이콘을 삽입하려고하면, 유틸리티의 getRowStart() 메소드는 널 포인터 예외를 발생시킵니다. 내가 이것에 대해 비정상적인 것을 발견 한 것은 자바 문서가 "... 이것은 관련된 문서에서 한 문자의 속성으로 표현됩니다."라고 말합니다. 그래서 다른 문자로 취급 할 것이라고 생각했지만이게 보이는 것 같습니다. 그렇지 않아.

누구든지 문제를 재현하려면 코드 예제를 포함 시켰습니다. 나는 단지 그것이 가능하지 않다는 느낌을 가지고있다. 그것은 수치 스럽다.

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() {테스트 t = 새 테스트(); t.getLineCount();}}); ' –

+0

아 그래요, 고맙다! – samcp20

+2

@ samcp20 [텍스트 유틸리티] (https://tips4java.wordpress.com/2008/10/26/text-utilities/)를 확인하십시오. 여기에는 텍스트 구성 요소 API를 사용하여 행 수를 얻는'getLines()'메소드가 들어 있습니다. 삽입 된 구성 요소로 시도한 적이 없지만 코드가 훨씬 간단하다는 것을 인정해야합니다. – camickr

답변

3

문제는 다음 주석 후 해결되었다 : 나는 EventQueue.invokeLater() 전화 내부 주요 방법 내부의 내용을 포장하면

그것은 나를 위해 예외를 throw하지 않습니다. 즉 : 나는 내 주요 방법 내부의 내용을 포장하면 그것은 나를 위해 예외를 throw하지 않습니다

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     Test t = new Test(); 
     t.getLineCount(); 
    } 
});