2014-03-06 31 views
0

我正在编写Java应用程序并试图绘制BufferedImage。在我的主要内容中,JFrame正在创建,JPanel正在创建并被添加到JFrame中。还有一个正在启动的线程正在重绘,但它什么也没有显示,我的System.out.println()在paintComponent中也没有被调用。我搜索了很多,但我没有找到解决我的问题。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中的线程时必须小心,也不需要定期调用repaint,如果在绘制完成后添加/删除组件,则需要调用repaint。请阅读[如何在swing中使用线程](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

看起来像你对我是在面板后面添加面板ame是可见的。当你这样做时,布局管理器不会被调用,并且面板的大小是(0,0),所以没有东西可以绘制。

重构你的代码。面板的创建应该在Frame类中完成,而不是在Main类中完成。

此外,使用更好的名称,而不是帧。 AWT已经有一个叫Frame的类,所以你的名字很混乱。让你的课堂名称更具描述性。

+0

真的很感谢,它的工作原理。我已经将Frame改为另一个名字,你是对的,这是一个奇怪的名字。我刚刚编辑我的主,以便帧被设置为短时间不可见:frame.activePanel = new LoginPanel(); \t \t frame.add(frame.activePanel); \t \t frame.setVisible(false); \t \t frame.setVisible(true); \t \t new Main(); – Geosearchef

+0

@Geosearchef,'我刚刚编辑了我的主画面,以便画面在短时间内不可见 - - 不!这不是解决问题的方法!登录面板属于框架类,所以它应该在框架类中创建。不要采取捷径! – camickr

+0

你是对的,但它不想写清晰的代码,我想写一个非常快的应用程序。当我有时间时我会改变它。 – Geosearchef

相关问题