JTextPane行数包括图标和组件

时间:2016-08-07 22:31:28

标签: java swing jtextpane

我最近一直在尝试JTextPanes的用户即将开展的即将开展的项目,网上有各种帖子,详细说明了如何计算文本窗格中的行数,但我发现的解决方案将图标或组件插入文本窗格的文档时似乎都失败了。

我发现用于纯文本的解决方案是这个(当然实现了解决方案):{{3}}

但是,一旦我尝试插入Component(JLabel)或普通Icon,那么Utilities的getRowStart()方法会抛出空指针异常。我发现这个不寻常的是Java Doc声明“......这在相关文档中表示为内容的一个字符的属性。”所以我认为它会将其视为任何其他角色,但似乎这是不是这样的。

如果有人想尝试,我已经包含了一个代码示例来复制问题。我觉得这根本不可能,这将是一种耻辱。

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

1 个答案:

答案 0 :(得分:3)

以下评论后问题得以解决:

  

一旦我将内容包装好,它就不会为我抛出任何异常   EventQueue.invokeLater()调用中的主要方法。即:

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