2017-05-09 11 views
0

내 컴퓨터 과학 수업에서 우리는 자바를 배우고 있으며 우리는 객체 지향과 그것이 유용하다는 것을 배우는 과정에서 핵심으로 왔습니다. 며칠 전에 프로젝트를 시작했는데, 기본 객체 지향에 대한 임무 대신에, 선생님은 실제로 우리를 가르치지 않고 그래픽을 바로 만들어서 저와 다른 몇몇 사람들에게 도전하기로 결정했습니다.JPanel 객체 지향 그래픽

우리는 정수를 받아 배열을 만들 수있는 "분자"프로그램을 만들고 배열의 각 사용 가능한 섹션에 대해 임의의 x 및 y 좌표와 반경의 크기를 작성해야했습니다. 이 변수를 사용하면 타원이 생성됩니다. 또한 선생님은 JFrame 또는 JPanel을 사용하여이 작업을 수행해야한다고 말했고 JFrame을 선택했습니다.

아래 코드에서 내 시도를 볼 수 있으며 어디서 붙어 있습니다. 나는이 경우 중요하지 않기 때문에 다른 색상을 설정하는 부분을 주석 처리했습니다. 누군가가 나에게 도움이되지만 내가 잘못 가고, 어떻게 미래에이 문제를 해결하는 곳도 나에게 설명 할 수 있다면

/** 
* Name: Dylan Eisen 
* Date: May 1, 2017 
* Project: Object Oriented 
* Program: Molecules.java 
*/ 

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
public class Molecules extends JFrame 
{ 
    static Graphics g; 
    public Molecules(Graphics g, int x, int y, int size) 
    { 
     super.paint(g); 
    } 
    public static void main(String[] args) 
    { 
     Scanner in = new Scanner(System.in); 
     System.out.print("Enter the number of elements: "); 
     int num = in.nextInt(); 
     int x = 20, y = 20, size = 20; 
     object elements[] = new object[num]; 
     for(int i = 0; i < elements.length; i++) 
     { 
      x = (int)(Math.random()*1600); 
      y = (int)(Math.random()*900); 
      size = (int)(Math.random()*100); 
      elements[i] = new object(g, x, y, size); 
     } 
     Molecules f = new Molecules(g, x, y, size); 
     f.setSize(1600, 900); 
     f.setVisible(true); 
     //f.getContentPane().setBackground(Color.BLACK); 
     f.setTitle("Molecules Program - Dylan Eisen"); 
    } 
} 
class object 
{ 
    Graphics g; 
    int x, y, size; 
    public object(Graphics g, int x, int y, int size) 
    { 
     this.x = x; 
     this.y = y; 
     this.size = size; 
    } 
    void paint(Graphics g) 
    { 
     //g.setColor(Color.WHITE); 
     g.fillOval(x, y, size, size); 
    } 
} 

, 정말 도움이 될 것입니다!

답변

1

아무도 나에게 도움이 될 수있을뿐만 아니라 내가 잘못 가고있는 곳을 설명하고 미래에 이것을 고치는 방법은 정말 도움이 될 것입니다!

첫 번째 문제는 그림이 실제로 스윙에서 어떻게 작동하는지 이해하지 못하는 것입니다. 회화는 약간의 검은 마법이다. 스윙은 마법처럼 "paint"방법을 사용한다. 지나치게 복잡하지는 않지만 페인팅 프로세스가 어떻게 작동하는지 그리고 어떻게 인터 그레이 티드 할 수 있는지 더 잘 이해하려면 Painting in AWT and SwingPerforming Custom Painting을 사용하는 것이 좋습니다.

선생님도 JFrame 또는 JPanel 중 하나를 사용하여이 작업을 수행해야한다고 말하면서 JFrame을 선택했습니다.

나는 JPanel로 기본 구성 요소를 사용하는 것이 좋습니다 것입니다, 당신은 훨씬 더 유연한 솔루션을 제공 나중에 원하는 용기에 이것을 추가 할 수 있습니다.

일반적인 권장 사항으로 paintComponentJPanel으로 다시 정의해야합니다. 자신이 paint을 무시하면 아마도 잘못된 것이 될 수 있습니다.

JFrame 실제로 컨테이너

는 이중 버퍼링되지 않은 도장 공정이고 또한 프레임 자체에 포함 된 다른 구성 요소에 의해 방해 할 수 있기 때문에 당신은 또한, JFrame과 다른 문제가 있음을 알 수있다 contentPane 포함 JRootPane, JMenuBar

JFrame Layers

당신이 JFramepaint를 오버라이드 (override) glassPane의 OTH (사용자가 독립적으로 색칠 할 수 있음)

일반적으로 Graphics 컨텍스트는 이미지를 생성 할 수있는 일련의 루틴을 추상화 한 개념입니다.Swing은 paint 메서드를 통해 창을 그리는 데 사용되는 Graphics 컨텍스트를 전달하므로이 컨텍스트에 대한 참조를 유지하면 안되며 paint 메서드가 호출 될 때만 사용해야합니다. 즉, object 클래스에는 Graphics 컨텍스트가 필요한 생성자가 필요하지 않으며 페인트 방법/사이클 컨텍스트 내에서만 칠해야합니다.

I를 (그들은 부모 클래스를 지정하지 않은 경우) 자바는 다른 모든 클래스는 기본적으로 연장하는 그것의 자신의 Object 클래스를 정의로

object

는 클래스의 정말, 정말 나쁜 이름입니다 Code Conventions for the Java Programming Language을 살펴볼 것을 적극 권장합니다. 다른 사람들이 귀하의 코드를 읽고 다른 사람들이 귀하의 코드를 쉽게 읽을 수 있도록합니다.