2017-02-27 10 views
-1

그림 그래픽을 이해하려고하는데 내 타원을 그릴 수 없습니다. 누군가 내가 뭘 잘못하고 타원형이 그립지 않아? 어디에서 실수 했습니까?왜 타원을 그릴 수 없습니까?

Main 클래스 :

import java.awt.EventQueue; 
public class Main { 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      Frame frame = new Frame(); 

     } 
    }); 
} 

프레임 클래스 :

public class Frame extends JFrame { 
private static final long serialVersionUID = 1L; 

public static Grafika grafika; 

public Frame() { 
    JFrame frame = new JFrame("Title"); 
    grafika = new Grafika(); 

    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setLayout(null); 
    // frame.addKeyListener(this); 
    frame.add(grafika); 
} 
} 

그리고 마지막 GRAFIC 클래스 :

public class Grafika extends JComponent { 

int x = 200; 
int y = 200; 

public void paint(Graphics g) { 

    Graphics2D oval = (Graphics2D) g; 
    oval.setColor(Color.BLACK); 
    oval.fillOval(x, y, 100, 100); 
    oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON); 

} 
} 
+0

Frame 클래스가 JFrame을 확장하는 경우 프레임 생성자에서 새 JFrame을 만드는 이유는 무엇입니까? 당신은 이미 JFrame입니다. – FredK

답변

3

몇 가지 문제가 있지만 가장 큰 당신이 널을 사용하고 있다는 것입니다 레이아웃을 JFrame에 추가 한 다음 원하는 크기와 크기가 모두 0,0 인 JComponent를 추가합니다. 따라서 Grafika를 JFrame에 추가하는 동안에는 표시 될 기회가 없습니다.

제안 :

  • 매우 특별한 예외적 인 상황을 제외하고, null 레이아웃을 사용하지 마십시오.
  • Grafika 구성 요소에 getPreferredSize()을 우선하여 가장 적합한 크기를 지정하십시오. 그러나이 단계에서는 setPreferredSize(...)을 호출해도 괜찮을 것이라고 생각합니다.
  • JFrame에 추가하고 pack() JFrame을 추가 한 다음 마지막으로 모든 구성 요소를 JFrame에 추가 한 후에 만 ​​표시되도록 설정합니다.

또한

  • 당신은 paintComponent에이
  • 당신은 당신의 재정 내에서 슈퍼 그림 메소드를 호출한다 페인트하지 재정의해야합니다.
  • 때 항상 @Override 주석을 사용하면이 상위 메소드를 재정의한다고 생각합니다. 당신은 틀릴 수도 있고, 컴파일러가 당신에게 말하기를 원한다.
  • 렌더링 힌트 그리기 전에 설정하십시오. 그렇지 않으면 힌트가 도면에 영향을 미치지 않습니다.
  • 핵심 Java 클래스의 이름과 충돌하는 클래스 이름 (예 : Frame)을 사용하지 마십시오. 이것은 잠재적으로 다른 사람들과 당신의 미래를 혼란스럽게 할 것입니다.

예를 들어,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.*; 

public class MyGrafika extends JComponent { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    private static final Color OVAL_COLOR = Color.RED; 
    private int ovalX = 200; 
    private int ovalY = 200; 
    private int ovalWidth = 100; 
    private int ovalHeight = 100; 

    public MyGrafika() { 
     setPreferredSize(new Dimension(PREF_W, PREF_H)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(OVAL_COLOR); 
     g2.fillOval(ovalX, ovalY, ovalWidth, ovalHeight); 
    } 

    private static void createAndShowGui() { 
     MyGrafika mainPanel = new MyGrafika(); 

     JFrame frame = new JFrame("MyGrafika"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

당신이 paintComponent하지 paint를 오버라이드 (override) 할 필요가 Swing을 사용하고 있기 때문에, 당신은 또한 널 (null) 레이아웃을 사용하여주의를 기울여야한다.그러나 요점은 눈에 보이는 프레임을 만들기 전에 Grafika 구성 요소를 추가해야한다는 것입니다 :

frame.add(grafika); 
frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 

당신이 정말로 프레임이 가시화 된 이후 다음 재 검증을 전화 +를에 다시 칠해야하는 구성 요소를 추가해야하는 경우 프레임 또는 추가 된 구성 요소가 포함 된 패널 :

frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 
frame.add(grafika); 
frame.validate(); 
frame.repaint();