![](/img/trans.png)
[英]Program not accessing method paintComponent() of extended JPanel class
[英]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()
仅建议重新绘制管理器应绘制该组件,但这并不总是如此发生这种情况时,将在渲染组件后立即进行绘画,然后接受它并调整您的代码以解决此问题。 考虑:
更改此:
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.