2013-03-11 2 views
3

4 레이어가 추가 된 JLayeredPane이 있습니다. 1베이스 레이어는 불투명하고 3 개의 '투명'레이어 (setOpaque(false))입니다.JLayeredPane에서 패널을 투명하게 만드는 방법은 무엇입니까?

패널을 그릴 때마다 새로 고침을 할 때마다 회색 색상이 표시되는 것이 문제입니다. 새로 고침이 발생하지 않으면 동일한 문제가 발생합니다. 즉, 기본 레이어에 그려지는 것이 무엇이든 보여주는 대신 회색 색상이 표시됩니다. 위의 레이어 중 하나에 있다고 가정합니다. 여기에 SSCCE가 있습니다. 충분히 짧지 만 내 문제가 있는지 확실하지 않습니다.

public class SSCCE extends JLayeredPane{ 

public static void main(String[] args){ 
    JFrame frame = new JFrame(); 
    frame.setSize(950, 600); 
    frame.add(new SSCCE()); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

// private fields 
private boolean drawInitial = true; 
private boolean drawn = false; 

private JPanel overlay, base, iconPanel, middle; 
private BufferedImage baseBuffer, midBuffer, overlayBuffer, iconBuffer; 
private boolean updateInit = true; 
private Rectangle2D stored = new Rectangle2D.Double(60, 60, 40, 100); 

public SSCCE() { 

    setBorder(new LineBorder(Color.BLACK)); 
    setDoubleBuffered(false); 
    setOpaque(true); 
    setSize(new Dimension(950, 600)); 
    setPreferredSize(new Dimension(950, 600)); 

    base = new JPanel(); 
    base.setBackground(new Color(0,0,0,0)); 
    base.setSize(new Dimension(getWidth(), getHeight())); 
    this.add(base, new Integer(0)); 


    middle = new JPanel(); 
    middle.setSize(new Dimension(getWidth(), getHeight())); 
    middle.setBackground(new Color(0,0,0,0)); 
    middle.setOpaque(false); 
    this.add(middle, new Integer(1)); 

    overlay = new JPanel(); 
    overlay.setBackground(new Color(0,0,0,0)); 
    overlay.setOpaque(false); 
    overlay.setSize(new Dimension(getWidth(), getHeight())); 
    this.add(overlay, new Integer(2)); 
    iconPanel = new JPanel(); 
    iconPanel.setBackground(new Color(0,0,0,0)); 
    iconPanel.setSize(getWidth(), getHeight()); 
    iconPanel.setOpaque(false); 
    this.add(iconPanel, new Integer(3)); 

} 

public void update() { 
    if(updateInit){ 
     checkBuffer(); 
     updateInit = false; 
    } 
    drawInfoRect(); 
    drawIcon(); 
    highlightPath(stored); 
} 

public void render() { 
    if (drawInitial) { 
     Graphics2D baseGraphics = (Graphics2D) base.getGraphics(); 
     baseGraphics.drawImage(baseBuffer, 0, 0, null); 
    } 
    setResistanceColor((Graphics2D)baseBuffer.getGraphics()); 
    middle.getGraphics().drawImage(midBuffer, 0, 0, null); 
    iconPanel.getGraphics().drawImage(iconBuffer, 0, 0, null); 
    drawInfoRect(); 
    base.getGraphics().drawImage(baseBuffer, 0, 0, null); 
    if (drawn) { 
     overlay.getGraphics().drawImage(overlayBuffer, 0, 0, null); 
    } 
    repaint(); 
} 

// /** 
// * draws the appropriate colour 
// */ 
@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    update(); 
    render(); 
} 

/** 
* sets the appropriate colours according to the resistance 
* @param g2 
*/ 
private void setResistanceColor(Graphics2D g2) { 
     Rectangle2D sp = new Rectangle2D.Double(50,50, 50, 50); 
     g2.setColor(Color.GREEN); 
     g2.fill(sp); 
     g2.setColor(Color.BLACK); 
} 

/** 
* checks if there already exists an image to buffer with 
*/ 
private void checkBuffer() { 
    if (baseBuffer == null) { 
     baseBuffer = (new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB)); 

     // background color 
     Graphics2D g2 = (Graphics2D) baseBuffer.getGraphics(); 
     g2.setColor(Color.decode("#729fcf")); 
     Rectangle2D rect = new Rectangle2D.Double(0, 0, baseBuffer.getWidth(), baseBuffer.getHeight()); 
     g2.fill(rect); 
    } 
    if (midBuffer == null) { 
     midBuffer = (new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB)); 
     // background color 
     Graphics2D g2 = (Graphics2D) midBuffer.getGraphics(); 
     g2.setColor(Color.RED); 
     Rectangle2D rect = new Rectangle2D.Double(0, 0, midBuffer.getWidth(), midBuffer.getHeight()); 
     g2.fill(rect); 
    } 
    if (overlayBuffer == null) { 
     overlayBuffer = (new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB)); 
    } 
    if (iconBuffer == null) { 
     iconBuffer = (new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB)); 
    } 
} 

public void highlightPath(Shape enlighten) { 
    Area area = new Area(); 
    area.add(new Area(enlighten)); 
    // clearing image before drawing 
    Graphics2D midBufferG = (Graphics2D) midBuffer.getGraphics(); 
    clearImage(midBufferG); 

    midBufferG.setColor(Color.white); 

    // adds a transparent overlay 
    midBufferG.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f)); 
    midBufferG.fill(area); 
} 

public void drawIcon() { 
    Graphics2D iconG = (Graphics2D) iconBuffer.getGraphics(); 
    clearImage(iconG); 
} 

public void drawInfoRect() { 
    Graphics2D graph = (Graphics2D) overlayBuffer.getGraphics(); 

    Rectangle2D visible = getVisibleRect(); 
    int boxX = (int) (visible.getX() + 50); 
    int boxY = (int) (visible.getY() + 450); 

    RoundRectangle2D rect = new RoundRectangle2D.Double(boxX, boxY, 200, 150, 25, 25); 

    graph.setColor(Color.decode("#729fcf").darker()); 
    graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); 
    graph.fill(rect); 

    graph.setColor(Color.BLACK); 
    drawn = true; 
} 


private void clearImage(Graphics2D graph){ 
    graph.setComposite(AlphaComposite.Clear); 
    graph.fillRect(0, 0, overlayBuffer.getWidth(), overlayBuffer.getHeight()); 
    graph.setComposite(AlphaComposite.SrcOver); 
} 

}

그것은 내가 만든 몇 가지 기본적인 실수가 될 수 있습니다. 당신의 도움을 주셔서 감사합니다!

+0

차이를 만들어서는 안되지만 "PALETTE_LAYER", "DRAG_LAYER"등을 사용하는 이유를 모르겠습니다. 특수 목적의 레이어입니다. 일반적으로 추가 레이어마다 Integer 값을 사용합니다. 어쨌든 나는 여러 개의 투명 레이어에 문제가 없습니다. 문제를 보여주는 [SSCCE] (http://sscce.org/)를 게시하십시오. – camickr

+0

댓글을 주셔서 감사합니다! 요청한대로 SSCCE를 추가했습니다. – chibi03

+0

render는 repaint를 호출하면 안됩니다. –

답변

1

이전에 제안 된 답변 중 하나는 실제로 내 질문을 해결했지만 실제로는 답변을 삭제했습니다.

내 패널의 배경을 setBackground(new Color(0,0,0,0));으로 설정하면 내 문제가 해결됩니다.

이 문제를 제기 한 사람에 따르면, JComponent가 명시 적으로 지정되지 않은 경우 투명하게 그릴 수 있다는 사실이 그 원인입니다. 다시 한번 감사드립니다!