JOptionPane中JEditorPane内部的超链接抛出NullPointerException

时间:2015-04-08 19:04:18

标签: java html hyperlink nullpointerexception jeditorpane

我回来了另一个问题。我之前没有使用Java中的URL和超链接,也没有使用html标记的经验。我已经阅读了教程和很多SO问题,似乎无法弄清楚为什么我会在这里抛出异常。

所以我有一个程序,我添加了一个"关于"按钮到。单击它将打开JOptionPane。在JOptionPane内部,我有一个带有大量文本的JEditorPane,最后是我用作源的网站的两个超链接。现在我添加了链接并且它们是可点击的,但是当我单击它们时,它会抛出NullPointerException。我确信它与ActionListener有关,我尝试了几种不同的方法来实现相同的结果。

我想要发生的是,当点击链接时,它会打开默认浏览器并导航到该网站。这是我试图调试的一个测试程序,但包含与我的主要代码相同的代码。

import java.awt.Desktop;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

public class HyperlinkTest extends JFrame {
    private static final long serialVersionUID = 1L;

    JPanel panel = new JPanel();
    JButton aboutButton = new JButton("About");

    public void aboutPopUp() throws IOException {

        final JEditorPane ep = new JEditorPane();

        ep.setEditable(false);
        ep.setEditorKit(JEditorPane.createEditorKitForContentType("text/html"));

        ep.setText("<html>Blah Blah<br />"
                + "Blah Blah<br />"
                + "Blah: <a href=\\\"\\\">http://exploration.grc.nasa.gov/education/rocket/rktcg.html</a><br />"
                + "Blah: <a href=\\\"\\\">http://exploration.grc.nasa.gov/education/rocket/rktcp.html</a></html>");

        // handle link events
        ep.addHyperlinkListener(new HyperlinkListener() {
            @Override
            public void hyperlinkUpdate(HyperlinkEvent e) {
                if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
                    if (Desktop.isDesktopSupported()) {
                        try {
                            Desktop.getDesktop().browse(e.getURL().toURI());
                        } catch (IOException | URISyntaxException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }
        });

        JOptionPane.showMessageDialog(null, ep, "How To Use", JOptionPane.PLAIN_MESSAGE);
    }    

    private void aboutButtonActionPerformed(ActionEvent ab) throws IOException {

        aboutPopUp();
    }

    private void initComponents() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(panel);
        panel.add(aboutButton);
        aboutButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ab) {
                try {
                    aboutButtonActionPerformed(ab);
                } catch (IOException ex) {
                    Logger.getLogger(HyperlinkTest.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        pack();
        setLocationRelativeTo(null);
    }

    public HyperlinkTest() {
        initComponents();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new HyperlinkTest().setVisible(true);
            }
        });
    } 
}

提前感谢你们提供的任何帮助,你们都摇滚!!

1 个答案:

答案 0 :(得分:0)

你有

ep.setText("<html>Blah Blah<br />"
            + "Blah Blah<br />"
            + "Blah: <a     href=\\\"\\\">http://exploration.grc.nasa.gov/education/rocket/rktcg.html</a><br />"
            + "Blah: <a href=\\\"\\\">http://exploration.grc.nasa.gov/education/rocket/rktcp.html</a></html>");

我认为你想要的是

ep.setText("<html>Blah Blah<br />"
            + "Blah Blah<br />"
            + "Blah: <a href=\"http://exploration.grc.nasa.gov/education/rocket/rktcg.html\">http://exploration.grc.nasa.gov/education/rocket/rktcg.html</a><br />"
            + "Blah: <a href=\"http://exploration.grc.nasa.gov/education/rocket/rktcp.html\">http://exploration.grc.nasa.gov/education/rocket/rktcp.html</a></html>");

请注意我没有编译此。你可能需要更好地/不同地逃避事情。

此外,您可能需要查看this