繁体   English   中英

为什么创建JPanel类对象时会自动调用paintComponent方法?

[英]Why does as the JPanel class object be created, the paintComponent method is automatically called?

这是关于JPanel的Java代码:

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” ,所以如果调用它,将会导致编译器错误。 这种设计是不可避免的吗?
当您这样做时,有必要发生吗? 我非常想知道这一点,当然也知道解决方案。

ps:根据官方文档,仅当我调用repaint() ,它才会调用paintComponent() 因此,我可以在paintComponent编写我的自定义代码。

意识到您无法控制何时或是否调用paint(...)paintComponent(...) ,因此repaint()仅建议重新绘制管理器应绘制该组件,但这并不总是如此发生这种情况时,将在渲染组件后立即进行绘画,然后接受它并调整您的代码以解决此问题。 考虑:

  • 将pics_to_be_drawn初始化为null(因此将其初始化为某种东西)
  • 然后在绘制之前检查它是否不为null。

更改此:

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);
            }
    }       
}

简单

当必须绘制面板时,Swing调用paintComponent()方法。 我认为在面板可见之前不会调用它。

就是说,一旦将面板添加到GUI,它就应该处于可绘制状态。 因此, paintComponent()方法应该处理尚未添加图片的情况,只需检查列表是否不为null(并且不为空)即可:

@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。

当窗口变为可见(未覆盖或最小化)或调整大小时,将自动调用Jpanel的paintComponent。 这是有关何时可以调用paintComponent的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM