2013-07-29 4 views
0

내가 그림그리기 캔버스 JFrame의

public class Game extends Canvas{ 
    //FIELDS 
    public int WIDTH = 1024; 
    public int HEIGHT = WIDTH/16 * 9; 

    //METHODS 
    public void start(){ 
     Dimension size = new Dimension (WIDTH, HEIGHT); 
     setPreferredSize(size); 
     paint(null); 
    } 

    public void paint(Graphics g){ 
     g.setColor(Color.GREEN); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 
     g.setColor(Color.BLACK); 
     g.fillOval(100, 100, 30, 30); 
    } 
} 

을 설정하고이 의미가 있습니다

public class MainW { 


    public static void main(String[] args) { 
     Game ga = new Game(); 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.add(ga); 
     frame.setVisible(true); 
     ga.start(); 

    } 

} 

창에서 한이 클래스에서, 캔버스와 간단한 모양을 그릴려고 만에 JFrame이 캔버스에 적용되지 않습니다. 개체를 보려면 창 크기를 수동으로 조정해야합니다. JFrame이 자동으로 Canvas를 포함하도록 어떻게 포장 할 수 있습니까?

편집 : 정말 이상합니다. frame.pack()이 실제로 필수적이지만, 충분하지 않습니다. 내가 한 일은 그런 식으로, 시작 방법을 변경하고 생성자로 돌려이었다

public class Game extends Canvas{ 
     //FIELDS 
     public int WIDTH = 1024; 
     public int HEIGHT = WIDTH/16 * 9; 

     //METHODS 
     public void Game(){ 
     Dimension size = new Dimension (WIDTH, HEIGHT); 
     setPreferredSize(size); 
    } 

다음, 다른 클래스에서, 이클립스 직접 (EG ga.Game를) 생성자를 호출에 대해 불평, 그래서 나는 다음 그것의 팁 및 변경 :

이 방법은 내가 마음에 있지만 내가 정말 생성자를 호출 할 수 없습니다 모르겠어요 달성이 방법.

frame.pack 크기 문제를 해결하기위한 : 캔버스에 그림 후

+1

의 읽기를 할 수 있습니다 ('진정한는, setVisible (GA) 추가'사이에서''와)'. – johnchen902

+2

AWT와 Swing 구성 요소를 불필요하게 혼합하지 마십시오. YOU는 JPanel과'paintCompoment (...) '오버라이드 메소드에 그려야합니다. –

답변

5

나는 당신이하려는 뭔지 모르겠지만, 당신은 결코 null를 통과하지 특히 ​​paint 및 호출 될 수 없습니다.

그림이 작동하는 방법에 대한 자세한 내용은 Performing Custom PaintingPainting in AWT and Swing에서 시작하십시오.

구성 요소 크기를 창에 표시하려면 몇 가지 중요한 정보를 제공해야합니다.

당신이 찾고있는 방법이 Window#pack이지만 적절한 크기 조정 힌트를 제공하지 않으면 도움이되지 않습니다.

이 경우 구성 요소의 getPreferredSize 메서드를 재정의하고 적절한 크기 값을 제공해야합니다. Window#pack은이 값을 사용하여이 값을 수용하기 위해 필요한 크기를 결정합니다.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestPaint { 

    public static void main(String[] args) { 
     new TestPaint(); 
    } 

    public TestPaint() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.GREEN); 
      g.fillRect(0, 0, WIDTH, HEIGHT); 
      g.setColor(Color.BLACK); 
      g.fillOval(100, 100, 30, 30); 
     } 
    } 
} 

페인트 체인은 매우 중요하고 모든 해안에 그것을 파괴하지 않도록해야합니다. 확인 당신은 항상 super.paintXxx 전화를 걸거나 심각한 불확실성에 대비

또한) (`frame.pack 추가 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

0

JFrame

public static void main(String[] args) { 
    Game ga = new Game(); 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.add(ga); 
    frame.setVisible(true); 
    ga.start(); 

    //repaint here 
    frame.repaint(); 
} 

은 또한 점에 유의 다시 칠하려고합니다.

frame.revalidate은 런타임에 구성 요소를 추가하거나 제거 할 때 도움이되는 경우가 있습니다.

2

사용 java.awt.Window.pack (JFrame 간접적 Window 확장)

원인이 창은 부성분의 바람직한 크기 및 레이아웃에 맞게 크기가된다.

// ... 
    frame.add(ga); 
    frame.pack(); 
    frame.setVisible(true); 
    // ...