2011-05-09 82 views
1

編輯:的Java Swing透明拉絲問題

我提交了錯誤的下面(可能需要AA幾天成爲認可雖然): http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043319

更多的細節:

  • 它適用於Windows Sun JDK 1.6版本13和17
  • 它在Ubuntu 11.04 x64上同時出現OpenJDK 1.6.0_22和Sun JDK 1.6 .0_24

我想要的是,以與在它上面的附加面板的背景圖像板(帶額外的組件 - 例如JButtons,自定義形狀等 - 在他們中),並繪製所有正確的。我在我的應用中使用JLayeredPane來達到這個目的,但爲了舉例,下面的代碼應該足夠了。無論下面的問題,我都樂於提供有關如何做我想做的事情的建議。

我遇到了這個問題,這幅畫的行爲真的很奇怪。它不會完全重新繪製(例如,只有圖像上方的頂部),它會重新繪製 - 從我注意到間隔越來越大的步驟(例如,第1層油漆,第3層油漆,第9層油漆,第21層油漆,第64層油漆等)。 )。我的猜測是我在這裏執行得太多 - 下面有什麼明顯的錯誤嗎?

在單獨的註釋中,下面有三條註釋行。有趣的是,取消註釋其中的任何一個並評論以下行可解決問題。這些圖像是具有以下屬性(這似乎並不重要,其圖像 - 只是大小):

cat.jpg  JPEG 640x533 640x533+0+0 8-bit DirectClass 110KB 0.000u 0:00.000 
cat-small.jpg JPEG 200x167 200x167+0+0 8-bit DirectClass 7.99KB 0.000u 0:00.000 

這裏是我遇到問題的Java代碼:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

public class SwingDrawingPrb { 
    public static void main(String[] args) throws Exception { 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    final JFrame frame = new JFrame("SwingDrawingPrb"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    final Container contentPane = frame.getContentPane(); 

    frame.setLocation(550, 50); 
    frame.setSize(1000, 800); 
    frame.setVisible(true); 

// ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat-small.jpg")); 
    ImageIcon image = new ImageIcon(SwingDrawingPrb.class.getResource("/cat.jpg")); 

    final JPanel imagePanel = new JPanel() { 
//  Color trans = new Color(255, 0, 0, 255); 
     Color trans = new Color(255, 0, 0, 64); 

     protected void paintComponent(Graphics g) { 
     System.out.println("painting"); 
     g.setColor(Color.white); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(trans); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.blue); 
     g.drawLine(0, 0, 1000, 1000); 
     } 
    }; 
    imagePanel.setBounds(0, 0, image.getIconWidth() + 200, image.getIconHeight() + 200); 
    imagePanel.setLayout(null); 

//  JLabel imageLabel = new JLabel("Hello, world!"); 
    JLabel imageLabel = new JLabel(image); 

    imageLabel.setBounds(100, 100, image.getIconWidth(), image.getIconHeight()); 
    imageLabel.addMouseMotionListener(new MouseAdapter() { 
     public void mouseMoved(MouseEvent e) { 
     System.out.println("mouseMoved"); 
     imagePanel.repaint(); 
     } 
    }); 
    imagePanel.add(imageLabel); 

    contentPane.add(imagePanel); 
    } 
} 

回答

3

你需要補充:

imagePanel.setOpaque(false); 

更多信息請參見Backgrounds With Transparency

+0

試過已經camickr,不起作用。實際上,嘗試了很多不起作用的東西:)正如你所看到的,我正在用Color.white做一個fillRect,所以它始終不會變得「變暗」。它只是沒有繪製所有的問題。它繪製一部分(幾乎總是圖像上方的一部分,但有時可能會看到其他效果)。如果你有一分鐘​​,嘗試運行它 - 你會明白我的意思。 – 2011-05-09 02:11:53

+0

還有一件事 - 有時(但並非總是 - 這是我不明白的另一件事),在啓動時畫框被正確繪製 - 即在透明的紅色東北方向的藍色線上的貓的圖像矩形,就像它應該的那樣。現在在任何其他重新繪製 - 要麼因爲我手動調用鼠標移動repaint或因爲我調整窗口大小 - 重新繪製嚴重。 – 2011-05-09 02:23:17

+0

我錯過了你先用WHITE填充背景。我其實根本沒有注意到任何繪畫問題。背景是淺紅色,帶有藍色對角線,圖像塗在對角線上。我在XP上使用JDK6.7。也許你有版本或平臺問題。 – camickr 2011-05-09 02:28:04