2011-05-09 5 views
1

편집 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043319자바 스윙 투명성 그리기 문제

좀 더 자세한 사항 :

    나는 (그것이 비록 승인이 될 aa는 며칠이 걸릴 수 있습니다) 아래의 버그를 제출

  • Windows Sun JDK 1.6 버전 13 및 17에서 작동
  • OpenJDK 1.6.0_22 및 Sun JDK 1.6을 모두 사용하는 우분투 11.04 x64에서는 작동하지 않습니다. 예를 들어, - 내가 원하는 무엇 .0_24

추가 구성 요소 (그 위에 추가 패널 배경 이미지 패널을 만드는 것입니다 JButtons, 커스텀 쉐이프 등)을 선택하고 모든 것을 올바르게 그립니다. 내 응용 프로그램에서 그 목적을 위해 JLayeredPane을 사용하고 있지만, 예제를 위해서 아래의 코드로 충분합니다. 나는 아래의 문제에 관계없이 내가 원하는 것을 어떻게 할 것인지에 대한 제안을한다.

저는 그림이 정말 이상하게 움직이는 문제에 직면 해 있습니다. 그것은 완전히 다시 칠하지 않습니다 (예 : 이미지 위의 윗부분 만). 다시 간격을 띄워 놓은 것에서부터 다시 페인트합니다 (예 : 1 차 페인트, 3 차 페인트, 9 번째 페인트, 21 번째 페인트, 64 번째 페인트 등).). 내 생각 엔 여기서 구현하기에는 너무 많은 부분이있을 것입니다. 분명히 아래에 잘못된 것이 있습니까?

별도의 메모에 3 개의 주석 처리 된 줄이 있습니다. 흥미롭게도 그 중 아무 것도 주석 처리를 제거하고 다음 줄을 주석으로 처리하면 문제가 해결됩니다. 이미지는 다음과 같은 특성이 함께있는 (그리고 중요하지 않습니다 보이는 이미지 - 단지 크기) : 여기

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 

내가 문제가 있습니다 자바 코드는 다음과 같습니다

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

이미 캠프를 시도했지만 작동하지 않습니다. 사실, 작동하지 않는 많은 것들을 시도해 보았습니다. :) 당신이 보았 듯이, Color.white로 fillRect를하고있어, 항상 "더 어둡다"는 레드를 얻지는 않습니다. 문제는 단지 모든 것을 그려 내지 못한다는 것입니다. 부분을 ​​칠합니다 (거의 항상 이미지 위의 일부이지만 때로는 다른 효과가 표시 될 수도 있음). 잠시 시간이 있다면 실행 해보십시오. 내 말 뜻을 알 수 있습니다. –

+0

한 가지 더 - 때로는 (항상은 아니지만 - 이것이 내가 이해할 수없는 또 하나의 것입니다.) 시동시 프레임이 올바르게 그려집니다 - 즉 투명 빨간색 위에 북동쪽으로 파란 선이있는 고양이의 이미지 직사각형. 이제 다른 repainting - mouseMoved에서 수동으로 다시 칠하기 때문에 또는 창 크기를 조정했기 때문에 - 심하게 다시 그립니다. –

+0

먼저 WHITE로 배경을 채우는 것을 놓쳤습니다. 실제로 어떤 그림 문제도 전혀인지하지 못합니다. 배경은 밝은 빨강 색이며 파란색 대각선이 있고 이미지는 대각선으로 그립니다. XP에서 JDK6.7을 사용하고 있습니다. 어쩌면 버전 또는 플랫폼 문제가있을 수 있습니다. – camickr