2017-10-29 26 views
1

주안 클래스와 서브 클래스 Circle 안에 paintComponent 메소드가있는 Circle이 있습니다. 이 메소드를 메인 클래스에 호출하여 Circle을 그리려고하는데 아무 것도 나타나지 않을 것이고 나는 왜 그런지 모르겠다.Java 다른 클래스의 paintComponent를 그려 내지 않을 것입니다.

내 Circle 클래스 :

public class Circle extends Shape { 
Integer rad; 

public Circle(int posx,int posy, int rad) { 
    this.posx = posx; 
    this.posy = posy; 
    this.rad = rad; 
} 

class drawCircle extends JPanel { 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.green); 
     g.fillOval(posx,posy,rad,rad); 
    } 
    } 
} 

내 주요 방법은

public class drawFrame extends JFrame { 
JPanel panel1; 
JPanel panel2; 
Square square1; 
Circle circle1; 



public drawFrame() { 

    panel2= new JPanel(); 
    panel1= new JPanel(); 

int rad = 0; 
    circle1 = new Circle(posx, posy,rad); 
    Circle.drawCircle drawCi = circle1.new drawCircle(); 
    add(panel1, BorderLayout.CENTER); 
    panel1.add(drawCi); 

을 니펫 그래서 기본적으로 난 그냥 코드의 주요 부분의 일부 조각을 부여했습니다. 내가 뭘 시도했는지 서클 drawCircle 내부 클래스에서 새로운 객체를 작성하여 mainPanel에 추가하여 내 Jframe에서 만든 새 서클 객체 인 mainPanel 내용을 출력합니까? 하지만 이것이 작동하지 않는 것 같습니다.

+0

대답 편집을 참조하십시오. 명확하지 않거나 질문에 답하는 경우 의견을 보내주십시오. –

답변

4

코드가 혼란스럽고 단순화하는 것이 좋습니다.

문제 : 당신은 내부 클래스, drawCircle 불필요을 사용하고

  • . 필요하지 않을 때 클래스를 중첩하지 말고 도면 구성 요소에 자체 독립 실행 형 클래스를 제공하십시오.
  • 그리기 구성 요소를 만들고 있지만 그래픽 구성 요소를 GUI에 추가하지 마십시오. JFrame을 최상위 창 (여기서는 JFrame)에 추가하지 않으면 표시되지 않습니다. 을 편집하십시오. 실제로 추가했지만 원하는 크기는 0
  • 입니다. paint이 아닌 paintComponent을 무시하고 있습니다. 이 문제는 나중에 문제를 일으킬 때 갑작스럽게 발생하는 애니메이션과 위험 (페인트가 구성 요소의 하위 구성 요소 및 테두리 그림에 영향을 미침)을 모두 전달합니다.
  • 그리기 구성 요소에 기본 크기 세트가 없으므로 크기가 [0,0]이되므로 그리기에 도움이되지 않습니다.

JPanel을 확장하는 독립 실행 형 중첩 클래스를 만들지 말고 원을 그리는 paintComponent를 재정의하고 표시된 JFrame에 반드시 추가해야합니다. 또한 드로잉 구성 요소의 기본 크기를 설정하거나 getPreferredSize() 메서드를 재정의합니다. 물론 컴포넌트를 추가 한 후 pack() JFrame을 확인한 다음 포장 후 setVisible(true)을 호출하십시오.

사소한 문제 : Java naming conventions을 배우고 사용하고 싶을 것입니다. 클래스 이름은 대문자로, 변수 이름은 모두 낮은 문자로 시작해야합니다. 이를 학습하고이를 따르면 코드를 더 잘 이해할 수 있으며 다른 사람들의 코드를 더 잘 이해할 수 있습니다.

사소한 quibble 2 : 반지름 (아마도 반지름으로 명명 됨)은 반지름이 아니라 지름으로 사용되기 때문에 "직경"이라고해야합니다.

예를 들어,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class DrawCircle extends JPanel { 
    private static final int PANEL_WIDTH = 600; 
    private static final Color CIRCLE_COLOR = Color.GREEN; 
    private int posx; 
    private int posy; 
    private int diameter; 

    public DrawCircle(int posx, int posy, int diamter) { 
     setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_WIDTH)); 
     this.posx = posx; 
     this.posy = posy; 
     this.diameter = diamter; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     // for smooth graphics 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(CIRCLE_COLOR); 
     g2.fillOval(posx, posy, diameter, diameter); 
    } 

    private static void createAndShowGui() { 
     DrawCircle mainPanel = new DrawCircle(100, 100, 400); 

     JFrame frame = new JFrame("DrawCircle"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
}