2012-07-03 56 views
1

这是java代码约JPanel为什么在创建JPanel类对象时,会自动调用paintComponent方法?

class Battle_field extends JPanel{ 
    public List<Image_Obj> pics_to_be_drawn;  

    @Override 
    public void paintComponent(Graphics g){  
      super.paintComponent(g);     
      g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null); 
    }  
} 

正如我设置的GUI:

added_panel= new Battle_field(); 
added_panel.setBorder(new LineBorder(SystemColor.activeCaption, 3)); 
added_panel.setBounds(27, 10, 397, 630); 
added_panel.setBackground(Color.white); 
this.getContentPane().add(added_panel); 

我发现Battle_field()对象的创建以上会自动调用paintComponent

但在这里,我没有初始化变量“pics_to_be_drawn”然而,如果它被调用时,它会导致编译错误。 这种设计是不可避免的?
当你这样做,有必要发生? 我想知道这一点,当然还有解决方案。

P.S: 根据官方文件,只有当我打电话repaint(),它会调用paintComponent()。所以我可以在paintComponent之内编写我的自定义代码。

+1

请学习java命名约定并坚持使用它们。 – kleopatra

+0

@kleopatra你是什么意思?请举例说明。谢谢。 – Stallman

回答

2

摇摆调用paintComponent()方法时,面板必须涂。我不认为它会调用它,直到面板可见。

也就是说,只要将它添加到GUI中,面板就应该处于可绘制状态。所以paintComponent()方法应该处理这种情况的照片还没有被添加的是,仅仅通过检查的情况下,该列表中,如果不为空(不空):

@Override 
public void paintComponent(Graphics g){  
    super.paintComponent(g);     
    if (pics_to_be_drawn != null && !pics_to_be_drawn.isEmpty()) { 
     g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null); 
    } 
} 

附注:我会在列表初始化为Collections.emptyList()或到new ArrayList<>(),这将避免检查null。我也会尊重Java命名约定:类和变量名称中没有下划线,camelCasing。

+0

好主意,以确保它不是第一次。我忘了那个。 1+ –

+0

哦,我的天啊,你如此快速和正确地回答答案。谢谢你,所以 多JB! – Stallman

2

意识到你不必如果paint(...)paintComponent(...)被调用时或超过控制,即只repaint()暗示重绘管理器组件时,应涂,但是,这并不总是发生,将立即发生绘画因为组件呈现为,然后接受并使用您的代码来解决此问题。试想一下:

  • 初始化pics_to_be_drawn为空(所以你把它初始化的东西)
  • 然后检查,这不是画前空。

更改此:

class Battle_field extends JPanel{ 
    public List<Image_Obj> pics_to_be_drawn;  

    @Override 
    public void paintComponent(Graphics g){  
      super.paintComponent(g);     
      g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null); 
    }  
} 

这样:

class Battle_field extends JPanel{ 
    public List<Image_Obj> pics_to_be_drawn;  

    @Override 
    public void paintComponent(Graphics g){  
      super.paintComponent(g);   
      if (pics_to_be_drawn != null) { 
       g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null); 
      } 
    }  
} 

简单

+0

为什么你们可以如此快地回答这个问题。令人惊叹的... 你们都很棒!谢谢! – Stallman

相关问题