2014-03-06 4 views
0

Java 응용 프로그램을 작성하고 BufferedImage를 페인트하려고합니다. 내 메인에서는 JFrame이 생성되고 JPanel이 생성되고 JFrame에 추가됩니다. 다시 그리기를 위해 스레드가 시작되었지만 아무것도 표시되지 않으며 paintComponent의 System.out.println()도 호출되지 않습니다. 나는 이걸 많이 봤어,하지만 난 내 문제를 해결할 아무것도 찾지 못했습니다.JPanel의 PaintComponent가 호출되지 않습니다.

내가 뭘 잘못하고 왜 잘못 된거야 ???

내 코드 :

주요 + 스레드

:

public class Main extends Thread 
{ 
    public static Frame frame = new Frame(); 

    public static void main(String[] args) throws IllegalStateException, IOException 
    { 
     frame.activePanel = new LoginPanel(); 
     frame.add(frame.activePanel); 

     new Main(); 
    } 

    public Main() 
    { 
     this.start(); 
    } 

    @Override 
    public void run() 
    { 
     while(true) 
     { 
      if(Main.frame.activePanel != null) 
       Main.frame.activePanel.repaint(); 

      try{Thread.sleep(15);}catch(InterruptedException e){} 
     } 
    } 
} 

JFrame에 :

public class Frame extends JFrame 
{ 
    public JPanel activePanel = null; 

    public Frame() 
    { 
     super(); 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setBounds(this.getToolkit().getScreenSize().width/2 - 640,this.getToolkit().getScreenSize().height/2 - 400,1279,799); 
     this.setResizable(false); 
     this.setUndecorated(true); 
     this.setVisible(true); 
    } 
} 

와 JPanel의 :

public class LoginPanel extends JPanel 
{ 
    BufferedImage loginImg; 

    public LoginPanel() throws IOException 
    { 
     loginImg = ImageIO.read(new File("src/images/Login.PNG")); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    {System.out.println("painting"); 
     g.drawImage(loginImg, 0, 0, null); 
    } 
} 
+0

확신이 없지만 paintComponent를 재정의하지 않으면 어떻게됩니까? – Frakcool

+0

동일한, 나는 백색 회색 창을 얻는다. 슬프게도,이 방법은 그것이 호출되었는지 확인할 수 없습니다. – Geosearchef

+0

와아, 와아! Swing에서 쓰레드를 다룰 때 조심해야하며, 다시 그리기를 주기적으로 호출 할 필요가 없다. 칠한 후에 컴포넌트를 추가/제거하면 다시 칠하기를 원할 것이다. [swing in threads 사용 방법] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)을 읽으십시오. [Event dispatch thread] (http : /docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html). – DSquare

답변

2

당신처럼 나에게 보이는 FRTER AFTER 후에 프레임에 패널 추가하기 ame가 보인다. 이 작업을 수행 할 때 레이아웃 관리자가 호출되지 않고 패널 크기가 (0, 0)이므로 페인트 할 것이 없습니다.

코드를 재구성하십시오. 패널 생성은 Main 클래스가 아닌 Frame 클래스에서 수행해야합니다.

또한 프레임 대신 더 나은 이름을 사용하십시오. AWT에는 이미 Frame이라는 클래스가 있으므로 이름이 매우 혼란 스럽습니다. 학급 이름을보다 잘 설명하십시오.

+0

정말로 감사합니다. 프레임을 다른 이름으로 바 꾸었습니다. 네 말이 맞아. 이상한 이름이야. 프레임을 잠시 동안 보이지 않도록 설정하기 위해 메인을 편집했습니다. frame.activePanel = new LoginPanel(); \t \t frame.add (frame.activePanel); \t \t frame.setVisible (false); \t \t frame.setVisible (true); \t \t 새 Main(); – Geosearchef

+0

@ Geosearchef, '방금 메인을 편집 했으므로 프레임이 잠시 보이지 않게 설정되었습니다.'- 아니요! 그것은 문제를 해결하는 방법이 아닙니다 !!! 로그인 패널은 프레임 클래스에 속하므로 프레임 클래스에서 만들어야합니다. 지름길을 이용하지 마십시오 !!! – camickr

+0

당신 말이 맞아요.하지만 명확한 코드를 쓰고 싶지는 않습니다. 저는 judit이 작은 응용 프로그램을 아주 빨리 작성하고 싶었습니다. 나는 시간이있을 때 그것을 바꿀 것이다. – Geosearchef

관련 문제