2013-03-12 4 views
0

내가 무엇을해도 화면에 직사각형/선/타원을 표시 할 수 없습니다. 그래픽을 그리는 다른 소스를 확인했지만 코드를 실행하더라도 창에 그래픽이 표시되지 않습니다. 아래는 텍스트 북의 예입니다.그래픽이 나타나지 않는다

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

class PlotGraph 
{ 
    public static void main (String [] args) { 
    JFrame win; 
    Container contentPane; 
    Graphics g; 

    win = new JFrame("testing"); 
    win.setSize(300,200); 
    win.setLocation(100,100); 
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    win.setVisible(true); 

    contentPane = win.getContentPane(); 
    g = contentPane.getGraphics(); 

    g.drawRect(10, 30, 50, 50); 

    } 

} 
+0

호기심에서 벗어난이 책은 무엇입니까? – wchargin

+0

OOP with Java (Thomas WU, 제 5 판) 페이지 257 – razshan

+0

그래픽에서도이 비디오를 보았지만 그래픽과 같은 문제가 나타나지는 않았지만 설명하는 사람의 비디오에서는 - http://www.youtube.com/watch?v=2l5-5PMUc5Y&list = PLFE2CE09D83EE3E28 – razshan

답변

1

그건 스윙에서 그래픽이 작동하지 않습니다.

구성 요소을 프레임에 그리는 것이 아니라 프레임에 추가해야합니다. 프레임에 직접 그릴 필요가 없습니다. 왜 아무 것도하지 않는 이유는 드로잉 코드가 무시되기 때문입니다.

구성 요소에 사용자 지정 그리기 코드가 있도록하려면 JComponent의 하위 클래스를 만들고 paintComponent(Graphics) 메서드를 재정의하십시오. 다음과 같이 이 작업을 수행하는 방법의 예는 다음과 같습니다

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

class PlotGraph { 
    public static void main(String[] args) { 
     JFrame win; 

     win = new JFrame("testing"); 
     win.setSize(300, 200); 
     win.setLocation(100, 100); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.setVisible(true); 
     win.setContentPane(new MyComponent()); 
    } 

} 

class MyComponent extends JComponent { 

    @Override 
    public void paintComponent(Graphics g) { 
     g.drawRect(10, 30, 50, 50); 
    } 
} 

내가 매우 당신이 Java GUI tutorial 온라인을 확인하는 것이 좋습니다 것입니다.

+0

+1 스윙 튜토리얼에 연결. 프레임이 표시된 후에 구성 요소를 추가하고 EDT에서 코드를 실행하지 않으려면 -1입니다. – camickr

+0

WChargin - 질문이 있습니다. 그것은 작동하지만 paintComponent 메소드는 어떻게 호출됩니까? 어떤 객체가 그것을 호출하고있는 것처럼. 나는 하나의 void 메쏘드가있는 MyComponent 클래스의 새로운 객체를 만든다. 둘 이상의 방법이 있다면? – razshan

+0

페인트 칠은 재 페인트 매니저가 결정/예약합니다. 자세한 설명은 [Psinting in AWT & Swing] (http://www.oracle.com/technetwork/java/painting-140037.html)을 참조하십시오. – MadProgrammer

3

아야. 그러면 교과서를 변경해야합니다. 우선, Swing 구성 요소에 대한 모든 액세스는 event dispatch thread에서 수행되어야합니다.

둘째, 구성 요소의 그래픽과 페인트를 가져 오면 안됩니다. 대신 JComponent 또는 JPanel을 확장하고 paintComponent(Graphics) 메서드를 재정의하고 인수로 전달 된 Graphics 객체를 사용하여 페인트해야합니다 (실제로는 Graphics2D 인스턴스 임).

관련 문제