2012-05-02 5 views
3

코드의 다음 스 니펫은 이어야합니다.은 첫 번째 모니터의 투명한 배경에 카운터를 증가시킵니다. 이미지가 0으로 표시되면 렌더링은 잘되지만 그 후에 (1을 치 자마자) 창은 불투명 한 배경으로 다시 그립니다.투명 이미지를 지우지 않는 Graphics2D

실제로 실례가되는 바보 같은 예를 들자면, 실제 사용 사례가 단순한 코드 조각으로 바뀌 었습니다.

키가 TestCanvas의의 paintComponent 방법에있을 수 있습니다 것 같다

g.setColor(new Color(0, 0, 0, 0)); 
g.clearRect(0, 0, getWidth(), getHeight()); 

내가 운동을 할 수 있는지, 그 두 줄은 완전히 투명하게, 그와 함께 주어진 영역을 취소 도면 색상을 설정해야합니다에서 색깔 - 그러나 이것은 첫번째 repaint 저쪽에를 위해 보전되고 있지 않는 것을 보인다.

편집 : clearRect 대신 fillRect를 사용하면 기존 이미지 위에 투명한 사각형을 칠하기 때문에 clearRect가 삭제되지 않습니다. 도 1에서, (1) 상에 오버레이 후 2,0에 오버레이되는 등

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 

public class LyricWindow extends JWindow { 

    private final TestCanvas canvas; 

    public LyricWindow(Rectangle area, boolean stageView) { 
     setBackground(new Color(0, 0, 0, 0)); 
     setArea(area); 
     canvas = new TestCanvas(); 
     canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY()))); 
     add(canvas); 
     new Thread() { 

      public void run() { 
       for(int i = 0; true; i++) { 
        final int ii = i; 
        SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          canvas.setText(Integer.toString(ii)); 
         } 
        }); 
        try { 
         Thread.currentThread().sleep(200); 
        } 
        catch(InterruptedException ex) {} 
        System.out.println(ii); 
       } 
      } 
     }.start(); 
    } 

    public final void setArea(final Rectangle area) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       if(canvas != null) { 
        canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY()))); 
       } 
       setSize((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY())); 
       setLocation((int) area.getMinX(), (int) area.getMinY()); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     LyricWindow w = new LyricWindow(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getConfigurations()[0].getBounds(), false); 
     w.setVisible(true); 
    } 
} 

class TestCanvas extends JPanel { 

    private String text; 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(new Color(0, 0, 0, 0)); 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     g.drawString(text, 100, 100); 
    } 

    public void setText(String s) { 
     text = s; 
     repaint(); 
    } 
} 

답변

2

밝혀졌습니다. 페인팅하기 전에 올바른 합성 값을 설정해야했습니다. 트릭은, 다음 fillRect()을 사용하여 paintComponent() 방법의 시작

((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC)); 

않았다 추가!

+1

이상하게도 솔루션은 Windows에서는 작동하지만 Ubuntu에서는 작동하지 않습니다. :( – ferrerverck

2

g.fillRect (...) 대신 g.clearRect (...)를보십시오. 나는 비슷한 문제가 한번 닥쳤다 고 생각한다. 그리고 이것은 나에게 그것을 해결했을지도 모른다.

BufferedImages과 함께 사용하기 위해 문제에 대한 원래의 해결책을 찾았습니다. 확실하지 화이트 블랙 않을 것 동안 작동하지만 그것을 시도 줄 수있는 색상 이유 : Color 클래스의 자바 독에서

g.setBackground(new Color(255, 255, 255, 0)); 
g.clearRect(0, 0, width, height); 

는 :

1.0 또는 255의 알파 값은 색상이 있음을 의미합니다 이 완전하게 불투명하고 알파 값이 0 또는 0.0이면 색이 완전히 투명 함을 의미합니다.

+0

아니요, fillRect로 지우지 않은 것 같습니다 (편집 참조). – berry120

+0

내 솔루션을 다시 시도하십시오.그것은 원래의 질문과 비슷하지만,'BufferedImage'를 지우기 위해 저에게 도움이되었습니다. – Nate

+0

고마워, +1이 효과가있는 것처럼 보입니다. 이미 다른 방법으로 해결했지만 (아래 답변을 참조하십시오.) – berry120

0

색상이 완전히 투명하다면 실제로 지워 집니까?

알파 값을 0이 아닌 255로 설정해보십시오. 문제는 회색을 (0, 0, 0)으로 "삭제"하는 것이지만 clearRect으로 투명하게 "삭제"할 수 있는지 확신 할 수 없습니다. 대신 fillRect을 시도해보십시오.

+0

답변을 주셔서 감사합니다. 불행히도 fillRect가 작동하지 않습니다. 편집을 참조하십시오. – berry120

0

나는 이것이 약간 오래된 것을 알고 있지만, 수퍼 클래스에서 함수를 호출하여 JPanel의 이미 빌드 된 기능을 사용하여 캔버스를 지우지 않으시겠습니까?

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(new Color(0, 0, 0, 0)); 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.RED); 
    g.drawString(text, 100, 100); 
} 

그리기 위해 완전히 빈 그래픽 개체가 있어야합니다.

관련 문제