2008-10-02 110 views
1

我正在開發一個使用SWT接口的eclipse插件。我需要顯示文本,並在該文本中需要鏈接。我發現的唯一兩個小部件將允許我在文本中包含可點擊的鏈接,即鏈接和瀏覽器。然而,瀏覽器對於我的需求來說是過度的,我無法正確定製它的外觀。這隻會留下Link小部件。SWT鏈接閃爍漸變背景

問題是我需要Link小部件從它所在的Composite繼承一個漸變。只有在調整大小或滾動Link組件時,它才能正確執行此操作。鏈接是我看到這種效果的唯一組件。

爲了解決這個問題,我嘗試將其他組件改爲可點擊鏈接,但是我還沒有找到一個好的解決方案。

有沒有辦法修復鏈接上的閃爍效果,還是有不同的組件支持鏈接?

感謝,

布賴恩

回答

1

度過一天這方面的工作後,我想出了一個解決方法。我爲文本區域創建了一個Composite。對於不是網址一部分的每個單詞,都有自己的標籤。對於鏈接,每封信都有自己的標籤。然後,url字符的標籤就有了一個偵聽器來啓動瀏覽器。使用此方法提供了鏈接功能,正確處理了調整大小,並且沒有閃爍。

1

您是否試過將SWT.NO_BACKGROUND傳遞給您的鏈接小部件?它可能會有點奇怪......你可能需要做更多的工作才能正確繪製GUI,但這是我的第一個猜測。

除此之外,這裏是我的Quick n'在StyledText中的一個鏈接的髒實現。你需要填寫改變光標(如果這是你想要的東西),以及提出一個很好的「文本到鏈接」映射方案。

唯一的是我不確定StyledText是否會繼承你的背景......給它一個鏡頭。

public class StyledTextExample { 
    public static void main(String [] args) { 
    // create the widget's shell 
    Shell shell = new Shell(); 
    shell.setLayout(new FillLayout()); 
    shell.setSize(200, 100); 
    Display display = shell.getDisplay(); 
    // create the styled text widget 
    final StyledText widget = new StyledText(shell, SWT.NONE); 

    String text = "This is the StyledText widget."; 
    widget.setText(text); 
    widget.setEditable(false); 

    final StyleRange hyperlinkStyle = new StyleRange(); 
    String linkWord = "StyledText"; 
    hyperlinkStyle.start = text.indexOf(linkWord); 
    hyperlinkStyle.length = linkWord.length(); 
    hyperlinkStyle.fontStyle = SWT.BOLD; 
    hyperlinkStyle.foreground = display.getSystemColor(SWT.COLOR_BLUE); 
    widget.setStyleRange(hyperlinkStyle); 


    widget.addMouseListener(new MouseAdapter() { 
     public void mouseUp(MouseEvent arg0) { 
      Point clickPoint = new Point(arg0.x, arg0.y); 
      try { 
       int offset = widget.getOffsetAtLocation(clickPoint); 
       if (widget.getStyleRangeAtOffset(offset) != null) { 
        System.out.println("link"); 
       } 
      } catch (IllegalArgumentException e) { 
       //ignore, clicked out of text range. 
      } 
     }}); 
    shell.open(); 
    while (!shell.isDisposed()) 
    if (!display.readAndDispatch()) display.sleep(); 
    } 
}