1

这是关于的java代码JPanel

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.

4

3 回答 3

2

意识到您无法控制何时或是否paint(...)调用 or paintComponent(...),这repaint()只会建议重绘管理器应该绘制组件,但这并不总是会发生,一旦组件被渲染就会发生绘制,并且然后接受这个并让你的代码解决这个问题。考虑:

  • 将 pics_to_be_drawn 初始化为 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);
            }
    }       
}

简单的

于 2012-07-03T14:08:45.700 回答
2

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

也就是说,一旦将面板添加到 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<>(),这将避免检查空值。我也会尊重 Java 命名约定:类名和变量名中没有下划线,camelCasing。

于 2012-07-03T14:11:59.683 回答
2

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

于 2012-07-03T14:17:34.093 回答