2013-04-28 2 views
0

2 개의 간단한 구성 요소를 JFrame에 추가하는 데 문제가 있습니다. 문제는 두 번째 구성 요소가 JFrame에 다르게 위치한 작은 모양 만 포함하더라도 첫 번째 구성 요소를 완전히 포함한다는 것입니다. 잠시 동안 탐색했지만 내 문제에 대한 해결책을 찾을 수 없습니다.간단한 JComponent를 사용하지 않는 부분을 투명하게 만들어서 JFrame에 추가 할 때 다른 구성 요소를 포함하지 않도록하려면 어떻게해야합니까?

public class Main 
{ 
    public static void main(String[]args) 
    { 
     JFrame frame = new JFrame(); 
     CircleComponent comp = new CircleComponent(400,400); 
     CircleComponent comp2 = new CircleComponent(200,200); 

     frame.add(comp); 
     frame.add(comp2); 
     frame.setSize(800,800); 
     frame.setVisible(true); 
    } 
} 

////////////////////////////////////////////////////////////////////////// 

public class CircleComponent extends JComponent 
{ 
    Ellipse2D.Double ellipse; 
    double x; 
    double y; 
    public CircleComponent(int xx, int yy) 
    { 
     x = xx; 
     y = yy; 
     ellipse = new Ellipse2D.Double(x,y,25,25); 
     setOpaque(false); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.fill(ellipse); 
    } 
} 
+0

야생의 추측이지만 단순히 가짜 작업에 대한 가시성을 두지는 않습니까? comp.setVisible (false); – DerpyNerd

+0

내 마음이 바보 같았습니다.) – DerpyNerd

답변

2

이것은 가시성과는 아무 관련이 없습니다. 레이아웃 관리자가 작동하는 방식과 관련이 있습니다.

JFrame의 기본 레이아웃 관리자는 BorderLayout입니다. 제약 조건을 지정하지 않고 구성 요소를 프레임에 추가하면 구성 요소가 CENTER에 추가됩니다. 그러나 하나의 구성 요소 만 CENTER에 추가 될 수 있으므로 추가 된 마지막 구성 요소 만 채색됩니다.

구성 요소 코드가 잘못되었습니다. 구성 요소를 칠하려면 원하는 크기와 크기가 있어야합니다. 레이아웃 관리자는 레이아웃 관리자의 규칙과 선호하는 크기를 사용하여 크기를 결정합니다.

BorderLayout의 CENTER에 대한 규칙은 구성 요소에 사용 가능한 모든 공간을 제공하기 때문에 코드가 작동합니다. 귀하의 경우 800x800 (프레임의 경계선 이하).

편집 :

내가 그들끼리가 서로 오버랩 할 수 있도록하는 레이아웃 매니저와 JPanel의에 구성 요소를 추가해야합니까?

여전히 getPreferredSize (..) 메소드를 구현해야합니다. 바람직한 크기는 x/y 위치와 직사각형의 너비/높이를 고려해야합니다. 이 작업이 완료되면 레이아웃 관리자를 사용할 수 있습니다. 그러나이 지원을 제공하는 표준 레이아웃 관리자는 없습니다.

그러나 Overlap Layout을 사용할 수 있습니다.

또 다른 방법은 구성 요소가 항상 구성 요소의 오프셋 (0, 0)에있는 사각형 그리기를 수행하도록하는 것입니다. 그런 다음 구성 요소의 setLocation (...) 메소드를 사용하여 구성 요소의 위치를 ​​지정합니다. 이것은 스윙에서 컴포넌트가 사용되는 방법에 대한보다 일반적인 접근 방식입니다. 며칠 전이 수업을 들으면서 수업을 듣게되었습니다.

이 코드는 원, 사각형 또는 기타 모양을 만들 수 있으므로 구성 요소보다 유연합니다. 기본 코드는 다음과 같습니다 :

Shape circle = new Ellipse2D.Double(0, 0, 25, 25); 
ShapeComponent sc = new ShapeComponent(circle, Color.RED); 
circle.setLocation(400, 400); 

또한 특별한 레이아웃을 사용하는 것이 좋습니다. 구성 요소의 임의 위치에 사용할 수있는 Drag Layout을 확인하십시오.

+0

응답 해 주셔서 감사합니다. 원하는 방식으로 코드를 변경하려면 어떻게해야합니까? 서로 겹칠 수있는 layoutmanager를 사용하여 JPanel에 구성 요소를 추가해야합니까? –

+0

@JeffreyPham, 편집 참조. – camickr