2

최근 이상한 아티팩트를 일으키는 반투명 구성 요소에 대한 질문을 올바르게 업데이트하지 못했습니다. 내가받은 대답은 유물이 사라지게했지만 반투명 한 대가를 치러야했습니다.자바 스윙 - 반투명 구성 요소

솔루션은 모든 반투명 구성 요소에 대해서도 마찬가지이며 setOpaque (false) 함수도 호출합니다. Swing은 이러한 방식으로 백그라운드에서 배경을 다시 그려야한다는 것을 알고있었습니다.

그러나 이것은 달성하고자하는 투명성을 희생 시켰습니다. 이로 인해 구성 요소가 대신 투명하게되었습니다.

전제 조건은 다음과 같습니다. 채팅 클라이언트 용 GUI를 디자인 중이며 기능 요청에 배경이 있어야합니다. JPanel 클래스를 확장하기위한 코드 스 니펫을 따라 배경을 성공적으로 만들었지 만 배경을 표시 할 수 있도록 구성 요소를 원했습니다. 반투명을 설정 한 후에 업데이트되지 않은 부분에 업데이트 된 구성 요소의 잔재가 표시되었습니다. 나는 여기에 와서 나의 문제를 풀었지만 지금은 새로운 문제가있다. 그래서 여기 있습니다.

그래서, 여기에 내가 추측 한 것입니다 :

원하는 각 구성 요소에 대한 setOpaque (거짓) 함수를 전화 해야지 내가 원하는 것을 달성하지 않는 반투명 색상을 설정하지.

- 반투명 색상을 설정하고 setOpaque (false)를 호출하지 않으면 반투명 배경이 표시 될 수 있지만 아티팩트가 발생하여 사각형이 다시 표시됩니다.

그래서 나는 아티팩트가없는 투명과 아티팩트가있는 반투명 사이의 중간 영역을 필요로합니다. 즉, 아티팩트가없는 반투명 배경 (완전히 투명하지는 않음)을 원합니다.

불투명도에 관계없이 모든 구성 요소를 다시 칠하도록 JFrame을 재정의해야 할 것처럼 보입니다. 내가 누락 된 것이 없으면 .. 내가 여기있는 이유는!

감사합니다.

은 (여기 참조를 위해 사진과 함께, 원래의 질문에 대한 링크입니다 : Java Swing - Translucent Components causing Artifacts)

답변

4

하나의 옵션은 배경을 직접 구성 요소를 무시하고 그리는 것 :

class TranslucentLabel extends JLabel { 
    public TranslucentLabel(String text) { 
     super(text); 
     setOpaque(false); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(new Color(255, 0, 0, 64)); 
     Insets insets = getInsets(); 
     g.fillRect(insets.left, insets.top, 
       getWidth() - insets.left - insets.right, 
       getHeight() - insets.top - insets.bottom); 
     super.paintComponent(g); 
    } 
} 

편집 : 또는 당신을 하위 구성 요소의 반투명 배경색을 패널에 직접 그릴 수 있으므로 구성 요소를 재정의 할 필요가 없습니다.

class YourPanel extends JPanel { 
    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D)g.create(); 

     // Draw your background image here to g2d. 

     g2d.setColor(new Color(255, 0, 0, 64)); 
     Area area = new Area(); 
     for (Component component : getComponents()) { 
      area.add(new Area(component.getBounds())); 
     } 
     g2d.fill(area); 
     g2d.dispose(); 
    } 
} 

이 방법에는 단점이 있습니다. 구성 요소의 진정으로 투명한 부분 (예 : 둥근 테두리)이 있으면 전체 배경에 색상이 지정됩니다.

+0

사용자 정의 배경을 허용하기 위해 이미 JPanel 클래스를 오버로드했습니다. 배경이있는 JPanel은 프레임의 내용 창입니다. overadde JPanel에 추가하고 불투명 한 구성 요소가 무엇을 다시 그리도록 강제하는 것이 더 낫습니까? 그렇게하면 모든 구성 요소를 재정의 할 필요가 없습니다. –

+0

이상적인 방법은 아니지만 다른 방법을 추가했습니다. –

+0

안녕하세요, 작동합니다! http://img408.imageshack.us/img408/186/help3i.png 도움을 많이 주셔서 감사합니다. 처리 할 둥근 모서리가 없어야합니다. 정말 좋습니다. 만약 내가했다면, for 루프에 대한 약간의 선택성이 나에게 잘 맞을 것이다. –