Search code examples
javaswingiconsjtextpaneimageicon

Inserting Images into a JTextPane Error


I asked about this before, but, I decided to start a new thread with a SCCE, it compiles sucessfully but it doesn't insert the image. Can anyone troubleshoot as to why it does this? Thanks, Chris.

Here is the full code:

package mathnotesplus;

import java.awt.Dimension;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JTextPane;

import javax.swing.JFrame;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.text.*;
/**
 *
 * @author ChrisCates
 */
public class MathNotesPlus extends JFrame implements TreeSelectionListener {

    /**
     * @param args the command line arguments
     */
    public MathNotesPlus() {
        setTitle("Math Notes Plus");
        setSize(800, 600);
        initUI();
    }


    JPanel panel;
    JTextPane textpane;
    JTree navigation;
    StyledDocument document;

    public void initUI(){
        //The panel.
        panel = new JPanel();
        //Textpane and JTree
        textpane = new JTextPane();
        navigation = new JTree();
        navigation.addTreeSelectionListener(this);
        //Preferred Resolution Size
        navigation.setPreferredSize(new Dimension(100, 600));
        textpane.setPreferredSize(new Dimension(700, 600));

        //Insertion of image into the document.
        try {
            document = (StyledDocument)textpane.getDocument();
            Style style = document.addStyle("StyleName", null);
            StyleConstants.setIcon(style, new ImageIcon("sigma.png"));
            document.insertString(document.getLength(), "ignored text", style);
        } catch (BadLocationException e){
            System.err.println("ERROR");
        }

        //Putting everything into the program.
        panel.add(navigation);
        panel.add(textpane);        
        add(panel);
        pack();


    }

    public static void main(String[] args) {
        // TODO code application logic here
        SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            MathNotesPlus app = new MathNotesPlus();
                app.setVisible(true);
            }
        });
    }

    @Override
    public void valueChanged(TreeSelectionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

Solution

  • Base on this working example (a very close variant of your code) that works, I can only guess that your code is failing because the image is not being found.

    import java.awt.Dimension;
    import java.awt.Image;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.event.*;
    import javax.swing.text.*;
    import java.net.URL;
    import javax.imageio.ImageIO;
    
    public class MathNotesPlus extends JFrame {
    
        JPanel panel;
        JTextPane textpane;
        StyledDocument document;
    
        public MathNotesPlus() {
            setTitle("Math Notes Plus");
            setSize(800, 600);
            initUI();
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
    
        public void initUI(){
            //The panel.
            panel = new JPanel();
            //Textpane
            textpane = new JTextPane();
            textpane.setPreferredSize(new Dimension(700, 600));
    
            //Insertion of image into the document.
            try {
                Image image = ImageIO.read(new URL(
                    "http://pscode.org/media/stromlo1.jpg"));
    
                document = (StyledDocument)textpane.getDocument();
                Style style = document.addStyle("StyleName", null);
                StyleConstants.setIcon(style, new ImageIcon(image));
                document.insertString(document.getLength(), "ignored text", style);
            } catch (Exception e){
                e.printStackTrace();
            }
    
            //Putting everything into the program.
            panel.add(textpane);
            add(panel);
            pack();
        }
    
        public static void main(String[] args) {
            // TODO code application logic here
            SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MathNotesPlus app = new MathNotesPlus();
                    app.setVisible(true);
                }
            });
        }
    }