2017-11-11 17 views
0

동일한 패널에 6 개의 도형을 그려야하는 과제가 있습니다. 여러 가지 시도를했지만 동일한 패널에 도형을 그리는 방법을 찾을 수는 없지만 다른 패널에서만 사용할 수 있습니다. 나는의 paintComponent 방법 작성하지 않은 이 클래스에서Java - paintComponent 및 다형성을 사용하여 도형 그리기

public abstract class MyShape extends JPanel 
public abstract class MyBoundedShape extends MyShape 
public class MyOval extends MyBoundedShape 
public class MyRectangle extends MyBoundedShape 
public class MyLine extends MyShape 

,하지만 난 속성으로 모양의 배열을 접수에 diffreent 클래스에 작성했습니다 :

이 나는 ​​모양에 대한 수업을 :

import javax.swing.*; 
import java.awt.*; 
import java.util.ArrayList; 

public class DrawingShapes extends JPanel implements Cloneable{ 
    private ArrayList<MyShape> Shapes; 
    public DrawingShapes(ArrayList<MyShape> Shapes){ 
     this.Shapes=Shapes; 
     initilizePaintComponent(); //draws a frame for the paintComponent 
    } 


    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 

     for (int i = 0; i <Shapes.size(); i++) { 
      g.setColor(Shapes.get(i).get_color()); 
      if (Shapes.get(i) instanceof MyRectangle){ 
       if (((MyRectangle) Shapes.get(i)).get_isFilled()){ 
        g.fillRect(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(), 
          Shapes.get(i).get_width(),Shapes.get(i).get_height()); 
       } 
       else 
        g.drawRect(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(), 
          Shapes.get(i).get_width(), Shapes.get(i).get_height()); 
      } 
      if (Shapes.get(i) instanceof MyOval){ 
       if (((MyRectangle) Shapes.get(i)).get_isFilled()){ 
        g.fillOval(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(), 
          Shapes.get(i).get_width(),Shapes.get(i).get_height()); 
       } 
       else 
        g.drawOval(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(), 
          Shapes.get(i).get_width(), Shapes.get(i).get_height()); 

      } 
      else 
       g.drawLine(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(), 
         Shapes.get(i).get_width(), Shapes.get(i).get_height()); 

     } 

    } 
    public void initilizePaintComponent(){ 
     JFrame frame = new JFrame("Shapes"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400,400); 
     for (int i = 0; i < Shapes.size(); i++) { 
      frame.add(Shapes.get(i)); 
      frame.setVisible(true); 

     } 

    } 

} 

내 문제는의 paintComponent 메소드가 작동하지 않는다는 것입니다 -이 프로그램은 하나의 모양을 그릴하지 않습니다.

프로그램을 실행 한 후 "Shape"라는 빈 프레임을 얻습니다. 프레임은이지만 Shapes는 작동하지 않습니다.

왜 paintComponent가 작동하지 않습니까?

감사합니다.

+0

"이 코드가 작동하지 않는 이유"를 묻는 경우 유효한 [mcve]를 작성하고 게시해야합니다. 그렇지 않으면 우리는 추측 할 수 있습니다. –

답변

2

이 :

public void initilizePaintComponent(){ 
    JFrame frame = new JFrame("Shapes"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400,400); 
    for (int i = 0; i < Shapes.size(); i++) { 
     frame.add(Shapes.get(i)); 
     frame.setVisible(true); 
    } 
} 

는 JFrame의 (모든 최상위 창) 기본적 인 BorderLayout으로 사용하는 레이아웃 매니저를 무시합니다. Shapes.size() 구성 요소를 JFrame에 추가 할 수 있지만, 기본 스타일로 추가하여 BorderLayout은 이전에 추가 된 구성 요소와 마지막으로 추가 된 구성 요소를 모두 포함하므로 마지막 구성 요소 만 볼 수 있습니다.

가능한 해결책 :

  • 만 사용 하나 JPanel에 그리기와의 paintComponent 메소드를 오버라이드 (override).
  • 가 아닌 GUI가 아닌 구성 요소에게 당신은 myShape 클래스가 그려 질 수 있습니다 논리적 클래스 코드를 확인하여 JFrame의의 BorderLayout.CENTER (기본 위치) 만이 하나의 도면 JPanel을 추가 JPanel 위의 단일 그림.
  • 이 클래스에게 방법을 보내기 그리기 JPanel의이 paintComponent에 내 전화 것 public void draw(Graphics g)
  • 그리기 JPanel의가 내 draw(g) 메소드를 호출, 그것의 paintComponent 방법 내에서를위한 루프은 myShape 객체의 목록을 통해 반복 되세요 고리.

이 답변에 대한 자세한 내용은 귀하의 질문에 유효한 MCVE 프로그램을 작성하여 게시하는 것을 고려하십시오.

+0

답변 해 주셔서 감사합니다. 내가 올바르게 이해한다면, 모든 반복에서 새로운 JPanel을 생성하고 있습니까? draw 메소드에서 무엇을 쓸 것인가? 예를 들어 drawOval() 메소드? – Alan

+0

내 문제는 항상 단일 JPanel입니다. 나는 패널에 그릴 수 있었다. 문제는 내가 추첨을 위해 클래스들을 결합해야 할 때 시작되었다. – Alan

+0

@Alan : 도움이 더 필요하면 유효한 [mcve]를 작성하여 게시하십시오.이 작업을 수행하는 방법에 대한 자세한 내용은 링크를 확인하십시오. –