2011-02-12 6 views
3

현재 대학 과정의 그룹 프로젝트를 진행하고 있으며 약간의 걸림돌을 쳤습니다. 우리가 구현하기로 결정한 프로그램은 사용자 이름 등을 저장하고 공유하기위한 중앙 서버가있는 피어 투 피어 채팅 클라이언트입니다. GUI를 수행하도록 지정되었습니다.자바 스윙 - 아티팩트를 일으키는 반투명 구성 요소

친구가 농담으로 "불타는 배경!"을 포함한다고 제안했습니다. 그래서 저는 그렇게하기로 결정했지만 사용자가 선택한 배경 이미지를 갖기로했습니다. 즉, 배경 이미지의 비트와 조각 만이 모든 구성 요소 위에 표시되므로 투명성 구현을 결정했습니다.

채팅 창에 입력 상자에서 정보를 보내거나 친구 목록을 탐색 할 때, 또는 채팅 창을 스크롤이 이상한 유물이 남아있는 내 문제가 자리하고있는 곳

이입니다. 이러한 아티팩트는 때때로 보내기 단추의 반투명 한 "고스트"이거나 때로는 메뉴의 일부이거나 오래된 텍스트이기도합니다. 전체 프레임이 제대로 다시 그려지지 않는 것처럼 보입니다. 그러나 어떻게 작동하는지 잘 모르겠습니다.

JTextComponent를 구현하는 구성 요소의 경우 선택 색상을 반투명 색상으로 설정합니다. 다른 구성 요소의 경우 배경을 반투명으로 설정합니다. 구성 요소를보고 setTranslucency (Component com) 함수를 사용하여 반투명도를 설정 한 다음 일부 정렬 컨테이너인지 확인하고 각 항목의 반투명을 재귀 적으로 설정합니다.

이제이 문제를 해결 한 방법은 창을 화면 밖으로 드래그하거나 화면을 뒤로 또는 아래로 드래그하는 등의 방법으로 창 밖으로 드래그하는 것입니다.

그래서,

1) 그것은 내가 화면 떨어져 드래그하거나 최소화 않을 때처럼 업데이트하기 위해 전체 창을 강제 할 수있는 방법이 있습니까?

또는

2) 나는 처음에 잘못을하고 있습니까? 그렇다면 어떻게 수정합니까? 여기

가 참조하는 픽처이다 :

http://i.stack.imgur.com/4J9GJ.png

답변

3

변경된 구성 요소를 다시 칠할 때 배경을 칠하도록 구성 요소가 반투명임을 Swing에 알려줘야합니다. 이를 위해 구성 요소는 isOpaque() 메서드에서 false을 반환해야합니다 (서브 클래스가 다른 작업을 수행하기 위해 isOpaque을 덮어 쓰지 않을 때 setOpaque(false)으로 수행 할 수 있음).

다른 답변이 제안 된대로 모든 것을 수동으로 다시 칠하지 않아도 작동합니다. (. 난 이미 한 번 이런 짓을)

편집 :이 이유가 스윙이 정말 다시 칠하기 만하면 이러한 구성 요소를 다시 그리기, 최적화 된 재 도장 - 알고리즘을 사용 (예를 들어, JTextField로 일부 입력 후) 또는 구성 요소 그 (것)들 앞에서, 불투명하다면. 재 페인트가 필요한 구성 요소가 불투명하지 않은 경우 (= 전체 공간을 비 반투명 색으로 채움), 뒤에있는 구성 요소를 다시 칠해 야합니다.

+0

자, 여기서 조언을 들었고 setTranslucency (..) 함수가 setOpaque (..)를 호출하지 않고 투명하게되도록 설정하여 올바르게 다시 그릴 수 있도록 결정했습니다. 구성 요소를 손으로 설정하면 제대로 반투명하고 불투명하게 보이고 올바르게 업데이트됩니다. 불투명도를 설정하지 않고 프레임을 반투명으로 설정하는 구성 요소를 부주의하게 살펴 보았습니다. 도움 주셔서 감사합니다. –

0

myComponent.revalidate();
myComponent.repaint();
다시 그리는 것이 "강제 실행"되는지는 모르지만 가능한 경우 수행하도록 요청합니다.

+0

흠 .. JFrame 클래스에는 revalidate() 함수가 없습니다. 다시 그리려는 구성 요소마다 revalidate() 및 repaint() 함수를 호출해야합니까? 나는 그것을 할 수 있고, 방금 했어. 그리고 그것은 효과가 없었습니다. 두 가지 작업을 수행하라는 메시지가 나타 났습니까 (먼저 구성 요소의 유효성을 다시 확인한 다음 다시 채 웁니다)? –

0

시도 JFrame.repaint(). 그게 효과가있다. JFrame의 맞춤 디자인을 원한다면 paint() JFrame 메소드를 오버라이드해야합니다. 또한 각 구성 요소를 사용자 정의 설계하려는 경우 각 GUI 구성 요소의 paint() 메소드를 대체해야합니다. 참고 사항 :

  1. GUI 구성 요소에는 paint()을 호출 할 필요가 없습니다. repaint()으로 전화하면됩니다.
  2. 다른 GUI 구성 요소 [JButton, JTextField ...]의 재정의를 수행하는 경우 해당 repaint() 메서드를 호출 할 필요가 없습니다. 부모 Container의 [JFrame, JPanel ...] repaint()이 작업을 수행합니다.