2011-02-12 33 views
3

我目前正在爲大學課程開展一個小組項目,而且我碰到了一個絆腳石。我們決定實施的程序是一個對等聊天客戶端,它具有用於存儲和共享用戶名的中央服務器等。我已被分配到GUI中。Java Swing - 造成僞影的半透明組件

一位朋友開玩笑地建議我包含「火紅的背景!」所以我決定這樣做,但要有一個用戶選擇的背景圖像。因爲只有背景圖像的零碎片段會在所有組件上方可見,所以我決定嘗試實現半透明。

這是我的問題在於:

發送時從輸入框信息,聊天窗口,或瀏覽好友列表時,或滾動聊天窗口,奇怪的文物留在後面。這些工件有時是發送按鈕的半透明「鬼魂」,有時是菜單的一部分,或者是舊文本。它看起來像整個框架沒有得到適當的重繪,但我不確定它是如何工作的。

對於實現JTextComponent的組件,我將它們的選擇顏色設置爲半透明顏色。對於其他組件,我將背景設置爲半透明。我有一個函數,setTranslucency(Component com)查看組件,根據它是什麼設置它的半透明性,然後查看它是否是某種類型的容器,並遞歸地設置每個項目的半透明度。

現在,我發現解決此問題的方法是將窗口拖出視線(例如將窗口最小化或拖動到屏幕外並將其拖回)。

所以,

1)是否有辦法迫使整個窗口更新喜歡它,當我將其拖離屏幕或最小化呢?

,或者

2)我是不是做錯了擺在首位?如果是這樣,我該如何解決它?

下面是參考一個圖:

http://i.stack.imgur.com/4J9GJ.png

回答

3

您需要告訴Swing組件是半透明的,因此它在重新繪製更改後的組件時也繪製背景。爲此,您的組件必須從isOpaque()方法返回false(當沒有子類覆蓋isOpaque來執行其他操作時,可以通過setOpaque(false)來實現)。

有了這個,它應該沒有任何手動重繪的一切工作,因爲提出的其他答案。 (我已經做了這一次。)

編輯:這樣做的原因是,搖擺使用優化重繪算法,重新繪製只有這些部件這確實需要重新粉刷(例如,一個JTextField經過一番輸入)或部件在這些人面前,只要他們不透明。當需要重新繪製的組件不是不透明的(=用非半透明的顏色填充整個空間)時,還需要重新繪製它們後面的組件。

+0

好的,我在這裏接受了你的建議,並決定我的setTranslucency(..)函數將事情設置爲透明,而不調用setOpaque(..)使它們正確重繪。在手動設置組件時,它們顯示爲半透明且不透明,並且正確更新。 這只是我粗心的貫穿框架中的組件,它們將它們設置爲半透明而不設置它們的不透明度。 感謝您的幫助! – 2011-02-13 00:37:38

0

myComponent.revalidate();
myComponent.repaint();
不知道它是否「強制」重繪,但它會要求它在可能的情況下進行重繪。

+0

嗯.. JFrame類沒有revalidate()函數。我需要爲每個要重繪的組件調用revalidate()和repaint()函數嗎?我能做到這一點,而且我做了,而且沒有奏效。你是否說要做這兩件事(首先重新驗證組件,然後重新繪製它)? – 2011-02-12 20:19:57

0

嘗試JFrame.repaint()。這應該工作。如果您想要自定義設計您的JFrame,那麼您將不得不覆蓋JFrame的paint()方法。此外,如果您希望定製每個組件,則必須覆蓋每個GUI組件的paint()方法。幾件事要注意:

  1. 您不必爲任何GUI組件調用paint()。您只需撥打repaint()即可。
  2. 如果您重寫其他GUI組件[JButtonJTextField ...],則不必調用它們的repaint()方法。母公司Container的[JFrame,JPanel ...] repaint()將完成這項工作。