2015-05-04 55 views
1

我一直在做一個聊天程序幾天,現在我徹底難倒了如何創建一個好看的可點擊文本而不使用HTML。我試圖使用HTML,但有非常奇怪的結果(見下文)。所以我現在只使用 基本文本而不是text/html。如何將可點擊的文本插入到JTextPane中?

clickable text with html

我添加可點擊文本的第一次嘗試是使用與文本一起插入Component小號JTextPane的能力。它插入並完美地工作,但它是垂直偏移,看起來非常糟糕。我試圖混淆setAlignmentY,但沒有運氣將組件與文本對齊。

JLabel l = new JLabel(test); 
    l.setFont(this.getFont()); 
    l.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
    l.setBackground(Color.RED); //Just so i could see it better for testing 
    l.addMouseListener(new FakeMouseListener()); 
    this.insertComponent(l); 

我使用JTextPane和使用doc.insertString插入文本。我使用系統行分隔符跳過行,所以一行可以包含多個doc.insertString(這是我在嘗試使用text/html時遇到的麻煩)。

+0

就像快速註釋一樣,您可以在保存文本的文本窗格中嵌入一個組件,並使該組件響應點擊(某些偵聽器模型,取決於組件)。 – user1803551

+0

@ user1803551是的,這就是我已經嘗試過。問題在於組件是垂直偏移的,看起來非常糟糕。它的作品,看起來很糟糕。 – TacoB

+0

噢,代碼中的'this'是一個'JTextPane'。那麼HTML有什麼不好呢?也許你可以張貼一張你想要的樣子,因爲我無法說出你所說的「看起來很糟糕」。 – user1803551

回答

0

原來,我把setAlignmentY(0.85f);爲JTextPane而不是JLable。

如果你有一個你正在嘗試插入到JTextPane中的偏移量組件,那麼就應該對它進行Y對齊。 0.85f適合我。

2

這插入HTML沒有任何對齊問題。我認爲(因爲我沒有足夠的代碼知道)(因爲Document.insertString,因爲我使用HTMLEditorKit.insertHTML而有問題)。

public class Example extends JFrame { 

    Example() { 

     JEditorPane pane = new JEditorPane(); 
     pane.setEditable(false); 
     pane.setContentType("text/html"); 
     HTMLDocument doc = (HTMLDocument) pane.getDocument(); 
     HTMLEditorKit editorKit = (HTMLEditorKit) pane.getEditorKit(); 

     try { 
      editorKit.insertHTML(doc, doc.getLength(), "<a href=\"http://click.com\">clickable1</a>", 0, 0, null); 
      editorKit.insertHTML(doc, doc.getLength(), "<a href=\"c2\">clickable2</a>", 0, 0, null); 
      editorKit.insertHTML(doc, doc.getLength(), "<a href=\"c3\">clickable3</a>", 0, 0, null); 
     } catch (BadLocationException | IOException e) { 
      e.printStackTrace(); 
     } 

     pane.addHyperlinkListener(new HyperlinkListener() { 

      @Override 
      public void hyperlinkUpdate(HyperlinkEvent e) { 

       if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { 
        System.out.println(e.getSourceElement()); 
        if (e.getURL() != null) 
         System.out.println(e.getURL()); 
        else 
         System.out.println(e.getDescription()); 
        System.out.println("-----"); 
       } 
      } 
     }); 

    add(pane); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new Example(); 
    } 
} 

注:

  • setEditable(false)必須調用這個正常工作(有可能是使它工作,否則一些令人費解的方式)。
  • HyperlinkListener只是爲了證明鏈接的工作原理,以及如何獲取鏈接字符串的一些演示(getURL僅在鏈接是有效的URL時纔有效)。
  • 無需設置遊標,無論是否帶有HyperlinkListener
+0

我嘗試這個之前的快速問題:什麼是插入普通文本的最佳方法?這是一個聊天程序,用戶可以嘗試在聊天中使用HTML。 – TacoB

+0

@bob您的意思是用戶將輸入將顯示在文本窗格中的聊天的不同組件?除非您希望能夠將圖像直接粘貼到輸入組件中,否則我會使用'JTextArea'。 – user1803551

+0

JTextArea的唯一問題是它不支持聊天顏色。這就是爲什麼我切換到JTextPane基本文本。 – TacoB

相關問題