JTextPane中的可单击文本

时间:2013-04-21 13:47:05

标签: java swing url jtextpane

我有一个声明如下的JTextPane:

JTextPane box = new JTextPane();
JScrollPane scroll = new JScrollPane();
StyledDocument doc = box.getStyledDocument();
scroll.setViewportView(box);
scroll = new JScrollPane(box);

我正在附加文字如下:

public void appendChatText(String text)
{   
    try
    {
        doc.insertString(doc.getLength(), text, null);
        box.setAutoscrolls(true);
        box.setCaretPosition(box.getDocument().getLength());    
    }
    catch(BadLocationException e)
    {
        e.printStackTrace();
    }
}

我还设法轻松地让JTextPane根据需要显示图像和组件,但我无法弄清楚如何将可点击文本编码到JTextPane中。例如,我希望它打印一条消息,上面写着“文件上传到服务器。接受 *拒绝*”,如果用户点击接受或拒绝字符串,那么它会执行相应的功能。关于如何有效实现这一目标的任何想法?

5 个答案:

答案 0 :(得分:7)

我最终用MouseListener和一个扩展AsbstractAction的类来解决这个问题。我添加了我想要成为JTextPane的可点击链接的文本,如下所示:

`Style regularBlue = doc.addStyle("regularBlue", StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE));
 StyleConstants.setForeground(regularBlue, Color.BLUE);
 StyleConstants.setUnderline(regularBlue, true);
 regularBlue.addAttribute("linkact", new ChatLinkListener(textLink));
 doc.insertString(doc.getLength(), textLink, regularBlue);`

我在其他地方的JTextPane上初始化了MouseListener,并将以下代码添加到我的侦听器类中:

public void mouseClicked(MouseEvent e)
        {
            Element ele = doc.getCharacterElement(chatbox.viewToModel(e.getPoint()));
            AttributeSet as = ele.getAttributes();
            ChatLinkListener fla = (ChatLinkListener)as.getAttribute("linkact");
            if(fla != null)
            {
                fla.execute();
            }
        }

最后,这引用了实际执行操作的类:

class ChatLinkListener extends AbstractAction
    {
        private String textLink;

        ChatLinkListener(String textLink)
        {
            this.textLink = textLink;
        }

        protected void execute()
        {
            if("accept".equals(url))
            {
                //execute code
            }
            else if("decline".equals(url))
            {
                //execute code
            }
        }

        public void actionPerformed(ActionEvent e)
        {
            execute();
        }
    }

答案 1 :(得分:3)

  

我还设法轻松获取JTextPane以根据需要显示图像和组件   ...我希望它能打印一条消息,上面写着“文件上传到服务器。接受拒绝

为什么不为“接受”和“拒绝”添加按钮?

否则您可以使用JEditorPane来显示HTML。然后,您可以在“接受”和“拒绝”文本中添加HyperlinkListener。阅读JEditorPane API以获取示例。单击文本时,HyperlinkListener需要一个URL,但我认为没有任何理由它不能只是一个字符串。

答案 2 :(得分:2)

mouselistener 添加到您想要点击的文本并执行适当的操作。

答案 3 :(得分:2)

如果您不想使用按钮,请使用JLabel。

如果您正在使用JTextPane,则可以使用insertComponent()方法插入与JTextPane字体具有相同字体的新JLabel,并且可以按照您希望的方式自定义JLabel,例如将光标设置为手形光标给它一个可点击的外观和感觉。

JLabel l=new JLabel("Click me");
l.setFont(textPane.getFont());
l.setCursor(new Cursor(Cursor.HAND_CURSOR));
l.addMouseListener(new MouseAdapter(){
   public void mouseClicked(MouseEvent me)
   {
         // your code
   }
});
textPane.insertComponent(l);

答案 4 :(得分:0)

我认为它是你想要的“JOptionPane”类 它应该给你选项按钮 - 例如:(“ok”/“取消”)