2010-01-15 2 views
1

여기 내 코드입니다 :

class Ramka extends JFrame 
    { 
    public static final int SZEROKOSC = 800; 
    public static final int WYSOKOSC = 600; 
    Container powZawartosci = getContentPane(); 
    public Ramka() 
     { 
     setSize(SZEROKOSC, WYSOKOSC); 
     setTitle("Siatka bryły by Paweł Mysior"); 
     } 
    public void addRectangle(int startX, int startY, int sizeX) 
     { 
     drawRectangle rect = new drawRectangle(startX, startY, sizeX); 
     powZawartosci.add(rect); 
     } 

class drawRectangle extends JPanel 
    { 
    private int a, startX, startY; 
    public drawRectangle(int startX, int startY, int a) // square 
     { 
     this.a = a; 
     this.startX = startX; 
     this.startY = startY; 
     } 
    public void paintComponent(Graphics g) 
     { 
     Rectangle2D rect = new Rectangle2D.Double(startX, startY, a, a); 
     Graphics2D g1 = (Graphics2D) g; 
     g1.draw(rect); 
     } 
    } 

public class Main 
    { 
    public static void main(String[] args) 
     { 
     Ramka ramka = new Ramka(); 
     ramka.addRectangle(200, 200, 50); 
     ramka.addRectangle(100, 100, 100); 
     ramka.addRectangle(300, 300, 150); 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ramka.setVisible(true); 
     } 
    } 

나는이 세 가지 사각형 (옆으로 이렇게의 기능과 의미를 폭넓게 그려지고 싶은, 그냥 계속 해요 배우기).

그러나 300 내가 정말 paintComponent에 일을 이해하지 못하는 (300)에서 시작하여, 마지막 하나를 그립니다 ... 사전에 어떤 도움

감사합니다, 폴

답변

1

나는 것을 믿습니다 서로 위에 세 개의 JPanel을 추가하고 있습니다. 이것은 직사각형을 그리는 이상한 방법으로 보이지만,이 디자인을 사용하려면 LayoutManager을 사용해야합니다.

this 링크를 확인하고 배우십시오. 아래의 코드는 트릭을해야합니다. 당신의 JPanel 파생 상품에


... 
Container powZawartosci = getContentPane(); 
public Ramka() 
    { 
    setSize(SZEROKOSC, WYSOKOSC); 
    setTitle("Siatka bryły by Paweł Mysior"); 
    setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));//Only this line is inserted. 
    } 
public void addRectangle(int startX, int startY, int sizeX) 
    { 
    drawRectangle rect = new drawRectangle(startX, startY, sizeX); 
    powZawartosci.add(rect); 
    } 
... 

, 당신은 당신이 그릴 필요가 Rectangle의 추적 할 수 있습니다. 아래 코드를 자발적으로 작성 중이므로 먼저 오류를 확인하십시오.

class RectangleDrawer extends JPanel{ 
    ArrayList<Rectangle> rList = new ArrayList()<Rectangle>; 
    public void addRectangle(Rectangle rect){ 
     rList.add(rect); 
    } 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     for(int i=0; i<rList.size(); r++){ 
      g.drawRectangle(rList.get(i)); 
     } 
    } 
} 
+0

그래, 난 그냥 반드시 JPanel의와 그 세 사각형을 그릴 것인지 말할 수있는 동안

주의 사항은, 그것은 어떤 것, 공통 이름/중괄호 스타일 그 때 추천 해? 하나의 JPanel에 3 개의 직사각형을 그릴 수 있습니까? – PawelMysior

+0

예, 한 JPanel에 무엇이든 그릴 수 있습니다. 나는 더 잘 설명하기 위해 나의 글을 편집 할 것이다. –

1

문제는 근본적으로 두 가지 다른 수준의 추상화를 사용하고 있다는 것입니다.

첫 번째로 JFrame에 컴포넌트를 추가하고 있습니다. 어느 시점에서 문제가 없습니다.

새 단추, 레이블 또는 다른 패널을 추가하는 것과 같은 방식으로 "DrawRectangle"인스턴스를 추가하고 있습니다. 동일한 위치에 구성 요소를 추가 할 때 문제가 발생합니다. JFrame의 메인 패널 (내용 창)은 제약 조건을 추가하지 않으면 중간에 구성 요소를 배치하는 "Border" layout manager을 사용합니다. 항상

powZawartosci.add(rect); 

: 편의으로

는 BorderLayout은 문자열 지정이없는 상수 CENTER 그래서

alt text http://java.sun.com/javase/6/docs/api/java/awt/doc-files/BorderLayout-1.gif

와 같은,이 라인을 해석 컴포넌트를 "가운데"에 추가하여 이전 컴포넌트를 덮어 씁니다. 그래서 하나의 직사각형 만 보았습니다.

여기에서 사용되는 추상화의 두 번째 수준은 구성 요소를 직접 페인트하는 것입니다. 이것은 낮은 수준이며 구성 요소에게 각 행을 그리는 위치와 위치를 알려줘야합니다.

동일한 구성 요소에 여러 개의 직사각형을 그리려면 목록과 같은 모음을 사용하여 참조를 보유한 다음 해당 모음을 반복하여 모두 그려야합니다.이처럼

는 :

many http://img40.imageshack.us/img40/8125/capturadepantalla201001nd.png

난 당신의 코드를 가지고 가고, 무슨 말인지 반영하기 위해, 그것을 변경했습니다. 최종 결과는 동일한 구성 요소를 사용하지만이 구성 요소는 모든 직사각형을 그립니다. 필수 아니지만 자바 프로그래밍

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

class Ramka extends JFrame { 
    public static final int SZEROKOSC = 800; 
    public static final int WYSOKOSC = 600; 
    Container powZawartosci = getContentPane(); 
    DrawRectangle rectangle = new DrawRectangle(); 
    public Ramka() { 
     setSize(SZEROKOSC, WYSOKOSC); 
     setTitle("Siatka bryły by Paweł Mysior"); 
     powZawartosci.add(new JLabel("Several rectangles are being displayed"), BorderLayout.NORTH); 
     powZawartosci.add(rectangle); 
    } 
    public void addRectangle(int startX, int startY, int sizeX) { 
     this.rectangle.addRectangle(startY, startY, sizeX); 
    } 

} 

class DrawRectangle extends JPanel { 
    private java.util.List<Rectangle2D> squares; 
    //private int a, startX, startY; 
    public DrawRectangle(){ 
     squares = new ArrayList<Rectangle2D>(); 
    } 

    public void addRectangle(int startX, int startY, int a) { // square 
     squares.add(new Rectangle2D.Double(startX, startY, a, a)) ; 
     //this.a = a; 
     //this.startX = startX; 
     //this.startY = startY; 
    } 
    public void paintComponent(Graphics g) { 
     Graphics2D g1 = (Graphics2D) g; 
     for(Rectangle2D rect : squares) { 
      g1.draw(rect); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Ramka ramka = new Ramka(); 
     //ramka.addRectangle(200, 200, 50); 
     //ramka.addRectangle(100, 100, 100); 
     //ramka.addRectangle(300, 300, 150); 
     for(int i = 0 ; i < 20 ; i++){ 
      ramka.addRectangle(i * 10 , i * 10 , i * 20); 
     } 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ramka.setVisible(true); 
    } 
} 
+0

고마워, 내가 뭘 잘못하고 있었는지 알 것 같아. 다시 한번 감사합니다 ;] – PawelMysior