我有搖擺的問題,我只是沒有找到的原因。我有一個擴展後的JTextPane來顯示背景圖片。這可以是柵格圖像(通過標準Java API顯示)或SVG矢量圖像(通過SVG Salamander顯示)。問題與背景圖像的JTextPane和剪切矩形
由於我希望文本窗格在頂部有一個區域用作不會顯示任何文本的頁邊距,我執行以下操作:我重寫paintComponent(),繪製背景圖像,然後調用super.paintComponent ()以便文本等將被示出,並且最後再次我但具有剪輯矩形油漆一塊背景圖像的覆蓋僅在頂部頁邊空白區域的文本。
這個工程除了我一直在爭奪兩天有點毛刺完美的罰款:與光柵圖像,如果我選擇在文本窗格中的文本,該文本被刪除,而不是突出。也就是說,當我選擇文本時,背景圖像顯示在我選擇的部分上。我不明白,這可能是爲什麼,因爲這繪製了圖像的第一個呼叫super.paintComponent方法()之前調用,第二個電話有一個剪輯矩形,因此只繪製了保證金,如果我不一切工作正常」不做選擇。一些額外的線索:
- 我知道這是關於第二個電話,因爲如果我評論它,我沒有這個問題(然後我沒有保證金,但是)。
- 奇怪的是當背景矢量圖像,只有一個光柵圖像也不會發生。
這裏是代碼爲我的paintComponent()方法:
public void paintComponent(Graphics g)
{
Rectangle rect = null;
if (rasterBackgroundImage != null)
{
rect = getVisibleRect();
g.drawImage(rasterBackgroundImage.getImage(),rect.x,rect.y,rect.width,rect.height,this);
}
if (vectorBackgroundImage != null)
{
rect = getVisibleRect();
vectorBackgroundImage.setPreferredSize(new Dimension(rect.width,rect.height));
vectorBackgroundImage.setScaleToFit(true);
vectorBackgroundImage.paintIcon(this, g, rect.x, rect.y);
}
super.paintComponent(g);
//if we want a non-scrolling top margin
if (rasterBackgroundImage != null)
{
g.setClip(rect.x,rect.y,rect.width,getMargin().top);
g.drawImage(rasterBackgroundImage.getImage(),rect.x,rect.y,rect.width,rect.height,this);
}
if (vectorBackgroundImage != null)
{
g.setClip(rect.x,rect.y,rect.width,getMargin().top);
vectorBackgroundImage.setPreferredSize(new Dimension(rect.width,rect.height));
vectorBackgroundImage.paintIcon(this, g, rect.x, rect.y);
}
}
如果有人想看看全班學生,它是在這裏:http://code.google.com/p/aetheria/source/browse/trunk/age/src/eu/irreality/age/swing/FancyJTextPane.java?r=301
注意,我我沒有要求修復,因爲它似乎是與其他類交互的問題。這就是爲什麼我沒有提供SSCCE:我試圖建立一個,但如果我單獨使用這個類...它的實際工作。我無法在整個系統之外再現問題,我不知道哪種交互產生了它。不過,我會非常感激的人提供指着我的方向是正確的暗示 - 也許有人已經看到了這種事情之前,可能有什麼可能是原因的線索......
更新:我設法解決了這個問題,通過停止使用setClip()。我發現這個答案建議不要在paintComponent()中使用setClip():java swing clipping problem
而不是使用剪切矩形,我現在創建一個子圖像,包含圖像的頂部,我想繪製的邊緣和直接繪製而不調用setClip()。這可能是非常低效的,因爲我在內存中存儲兩張圖像時應該足夠了,但至少它工作(tm)。如果有人對看到這種黑客感到好奇,它就在這裏(代碼現在有點髒):http://code.google.com/p/aetheria/source/browse/trunk/age/src/eu/irreality/age/swing/FancyJTextPane.java?r=305
如果有人能夠找出確切原因,爲什麼使用setClip()以這種方式導致這些問題或者知道解決這個問題的有效方法,這將會很有趣。感謝所有的答案!:)
我有一種感覺,這個問題將難以解決,如果它不能被隔離或轉載。 M(中等長度)SCCE如何,不需要矢量圖像? –
我會繼續嘗試製作一個。我試圖做到這一點,但問題是它沒有出現故障。我不知道我對文本窗格所做的外部操作可能會導致此行爲,但我會繼續尋找...... –
@Algorithm:請讓我們知道事情進展如何。您可以將您的代碼發佈到您之前所做的相同位置,並提供鏈接。如果你這樣做,那麼人們下載和運行它的可能性就比你可以發佈SSCCE的可能性要小,但我敢打賭,因爲它似乎是一個有趣的問題。運氣! –