2013-04-08 2 views
2

다른 타원 위에 하나의 타원을 페인트하려고합니다. 여기에서는 select 문을 사용하여 페인트 구성 요소 메소드를 그립니다.서로의 위에있는 물체에 페인팅

import java.awt.*; 

public class test extends JPanel{ 

public static final int OVAL = 1; 
public static final int SOLID = 2; 

private int type = LINE; 

public test(int type){ 

    this.type = type; 
} 
public void piantComponent(Graphics g){ 
    super.paintComponent(g); 

    switch(type) 
    { 
     case OVAL: 
     g.setColor(Color.YELLOW); 
     g.drawOval(0,0,150,150); 
     break; 

     case SOLID: 
     g.setColor(Color.BLUE); 
     g.fillOval(0,0,50,50); 
     break; 

    } 
} 


} 

이제 내 주된 방법으로 노란 타원형 (OVAL) 내부에 단색 파란색 타원형 (SOLID)을 표시하려고합니다.

import...; 
    public class Main{ 
     public static void main (String [] args){ 
      JFrame window = new JFrame(); 
      window.add(new test(test.OVAL)); 
      window.add(new test(test.SOLID)); 
      window.setSize(300,300); 
      window.setVisible(true); 

     } 

    } 

이것은 내가하고 싶은 일을 전혀하지 않습니다. 이것은 타원형과 단색이 아닌 타원형을 표시합니다. 나는 타원형 만 표시하도록 창을 오버로드한다고 생각합니다. 레이아웃 관리자 (gridlayout)를 사용하여 표시하려고 시도했지만 두 그림을 서로 위에 표시하지 않으면 두 그림이 서로 나란히 표시됩니다.

스위치 문을 잃어 버리지 않고 어떻게 해결할 수 있습니까?

+0

적절한 Java 클래스 이름을 사용하십시오. "test"는 표준 이름이 아닙니다. 클래스 이름은 대문자로 시작합니다. – camickr

답변

1
window.add(new test(test.OVAL)); 
window.add(new test(test.SOLID)); 

귀하의 문제의 ZOrder과 관련이있다 제로 Dimension을 가지고 있습니다. 단순화하기 위해, Swing은 패널에서 발견되는 역순으로 구성 요소를 그립니다. 따라서 귀하의 경우에는 고체가 OVAL로 칠해집니다. OVAL은 크기가 커서 SOLID를 덮습니다.

당신은 수행하여보다 직관적 인 순서로 구성 요소를 그리는 스윙을 강제 할 수

window.add(0, new test(test.OVAL)); 
window.add(0, new test(test.SOLID)); 

는 이제 마지막으로 추가 된 구성 요소는 마지막으로 그린 ​​것입니다.

그러나 더 나은 디자인은 크기, 위치 및 색상을 독립적으로 지정할 수 있도록 별도의 타원형 및 솔리드 클래스를 만드는 것입니다. 그런 다음 원하는만큼 많은 구성 요소를 패널에 추가 할 수 있습니다.

0

다른 페인트 바로 뒤를 페인트하면 어떨까요? 그와 마찬가지로 :

g.setColor(Color.YELLOW); 
    g.drawOval(0,0,150,150); 
    g.setColor(Color.BLUE); 
    g.fillOval(0,0,50,50); 
+1

그러나 Switch 문을 잃고 싶지 않으면? switch 문을 사용하여 페인팅 할 수 있지만 페인팅 중 하나만 표시하고 둘 다 표시하지는 않습니다. 즉, 다른 하나를 무시하게됩니다. 레이아웃 관리자를 사용하는 경우 다른 옆에 표시되고 서로 위에 표시되지 않습니다. – Jonathan

0

이 같은 (그냥 사용하여 조각) 시도 : 이것은 당신이 원하는만큼 타원을 추가 할 수

private ArrayList<int> ovals = new ArrayList<int>(); 


public test(int type) { 
     ovals.add(type); 
} 



public void piantComponent(Graphics g) 
{ 
     super.paintComponent(g); 

     for(int oval : ovals) 
     { 
      switch(type) 
      { 
       case OVAL: 
       g.setColor(Color.YELLOW); 
       g.drawOval(0,0,150,150); 
       break; 

       case SOLID: 
       g.setColor(Color.BLUE); 
       g.fillOval(0,0,50,50); 
       break; 
      } 
     } 
} 

을 (자신의 정적 위치에 있지만 그것은 단지 이상 쓸 것 캔버스). 부울 배열을 사용하여 반복적으로 시도해 볼 수 있습니다. 그 중 하나만 원하는 경우 특정 유형을 페인팅해야하는지 여부를 확인하기 위해 반복합니다.

1
  • Painting in Swing을 위해 수행해야 콘크리트 JComponent

  • public class test{ (적절한 명명 규칙을 사용하고 Texttest을 변경하는) 어떤 JComponents

  • 사용을 포함하지 않는 JPanel 또는 일반 JComponent

  • AWT에서 그림, Sw 기본적으로 보내고 결코 PreferredSize을 반환 한 후 컨테이너는

required to override getPreferredSize
+0

내 실제 프로그램이 아니라는 점에 유의하십시오! – Jonathan

+0

super.paintComponent (g); 이전의 모든 그림 지우기 – mKorbel

1
  1. 테스트 클래스에서의 수정.수정 설명에 대한 의견을 읽으십시오.

import java.awt. *;

공용 클래스 테스트 JPanel의 {

public static final int OVAL = 1; 
    public static final int SOLID = 2; 
    **public static final int BOTH = 3;** //instance variable to represent the 
             //painting of both images 

    private static int type; 

    public test(int type){ 
    this.type = type; 
    } 

    public void paintComponent(Graphics g){ 

    switch(type) 
    { 
     case OVAL: 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      break; 

     case SOLID: 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

     case BOTH:      //statements to draw both figures 
      g.setColor(Color.BLACK); 
      g.drawOval(0,0,150,150); 
      g.setColor(Color.BLUE); 
      g.fillOval(0,0,50,50); 
      break; 

    } 
    }//paint component 

} 메인 메소드 사용

  1. window.add (새로운 테스트 (test.BOTH)을 확장;