2014-09-25 39 views
0

我正在嘗試在JEditorPane上顯示圖像(帶有Jlabel)。我正在使用Swixml和Form Layout,我已經將JLabel和JEditorPane放在同一個地方。所以我簡單地設置「setVisible」爲truefalse使圖像出現。Z排序和疊加(JLabel和JEditorPane)

到目前爲止,萬物都不錯。但是,當有人試圖選擇在JEditorPane中的文字,這裏的醜陋的東西:Bug illustration

我嘗試一些事情:

  1. 禁用的JEditorPane:

    沒有影響,即使選擇nt可見,文本出現在JLabel上。

  2. 重繪:

    當我重新繪製的JLabel,這是推前了,但我必須repeateadly做到這一點(如每隔50毫秒),使之不可見;

    我也試圖重新繪製的選擇,但它不工作很好,有些情況下,只是忽略,或減緩,它仍然難看

  3. 最後的想法是爲了防止鼠標在JEditorPane中進入時JLabel的是顯示器,但MouseEnter事件不alow我獲得分數出來EditorPane的,所以它也變得很難把光標移動到一個好地方,出來的JEditorPane的...

我試過setComponentZOrder,但我不能使它工作得很好(我當然會誤用它),但我不認爲它可以解決我的問題,因爲它只會改變繪畫順序(最後被繪製的是Java的頂部),但它顯然是一個重新繪製的問題。

應該指出我不得不使用Java 1.6(在Java 1.7和1.8中我必須使用相同的命名類之間的衝突,Sun的更改日誌在1.9中討論修復......)

的背景是一個Applet,並在情況下我也不會理解的(英語不是我的母語),不要猶豫,糾正我,問我。

感謝您的幫助!

+0

注意:我討厭Java - 通常我也是,威士忌太好了 – mKorbel 2014-09-25 11:32:40

回答

2

讓我們來看看DefaultHighlighter。JEdi​​torPane中使用它來渲染選擇中(亮點) 它有方法

public void paint(Graphics g) { 
    // PENDING(prinz) - should cull ranges not visible 
    int len = highlights.size(); 
    for (int i = 0; i < len; i++) { 
     HighlightInfo info = highlights.elementAt(i); 
     if (!(info instanceof LayeredHighlightInfo)) { 
      // Avoid allocing unless we need it. 
      Rectangle a = component.getBounds(); 
      Insets insets = component.getInsets(); 
      a.x = insets.left; 
      a.y = insets.top; 
      a.width -= insets.left + insets.right; 
      a.height -= insets.top + insets.bottom; 
      for (; i < len; i++) { 
       info = highlights.elementAt(i); 
       if (!(info instanceof LayeredHighlightInfo)) { 
        Highlighter.HighlightPainter p = info.getPainter(); 
        p.paint(g, info.getStartOffset(), info.getEndOffset(), 
          a, component); 
       } 
      } 
     } 
    } 
} 

正如你可以看到它描繪的所有亮點。

您可以將JEditorPane的高亮顯示畫筆(DefaultHighlighter的實例)替換爲您的擴展名。 重寫paint()方法並將自定義剪輯添加到Graphics實例。基於JLabel矩形被減去的當前剪輯,剪輯應該具有自定義Shape。

+0

這是一個非常好的主意,我擴展了DefaultHightlighter,並且在圖像必須是所示。 它幾乎工作,文本和選擇不再可見。但我仍然有白色背景,我當然會錯過一些東西,對圖像作品重新繪畫,但它仍然很難看(閃光)。 無論如何,非常感謝! – 2014-09-26 09:37:56

+0

嘗試添加相同的剪輯邏輯到您的JEditorPane的paintComponent() – StanislavL 2014-09-26 10:32:38

+0

剪切paintComponent似乎使整個事情的錯誤^^它在圖像出現時起作用,但是當我突出顯示一些文本時,它完全混亂^^重新繪製應該足夠了: ) 謝謝 – 2014-09-26 13:48:15

0

我試圖創建一個Overlap Layout。我注意到了繪畫問題。與響應鼠標事件的組件相關。

在最後一段我說:

我也注意到,使用Jbutton將時,鼠標進入事件所造成的重疊按鈕頂部其他按鈕要塗,導致各部件的混亂渲染。如果你有這個問題,那麼解決方法是覆蓋JPanel的isOptimizedDrawingEnabled()方法返回false。這告訴重繪子系統組件重疊,以便正確解決繪畫問題。

也許這也將有助於你的情況。

+0

它不^^但是謝謝你的建議 – 2014-09-25 14:49:04