当前位置: 首页 > 知识库问答 >
问题:

repaint()未调用paintComponent()

史洛城
2023-03-14

首先,请不要因为创建一个问题而将我置于火刑柱上,而其他具有类似名称和内容的人却存在。我把它们都看了一遍,但没有找到解决办法。

调用repaint()绝对不会调用paintComponent(),不管我似乎尝试了什么。下面是与问题相关的所有代码:

 @Override
   public void mouseClicked(MouseEvent e) {//User clicks on play button, creates a new Level object. Level extends JPanel.
     if(isOnPlayButton(e.getPoint())){
       GameState.setState(GameState.INGAME);
       Level l = new Level(2);
       l.setVisible(true);
       Tetris.getWindow().setContentPane(l);
       Soundtrack.updateAudio();
       System.out.println("Level panel created and content pane set");
     }
   }

按照预期,“创建的级别面板和设置的内容窗格”被打印到控制台。

@SuppressWarnings("serial")
public class Level extends JPanel implements ActionListener{

  private final int levelNum;

  public Level(int levelNum){
    this.levelNum = levelNum;

    this.repaint();//Although this should work in the constructor, how about a Timer that repaints for confirmation?
    new Timer(2*1000, this).start();
  }

  @Override 
  public void paintComponent(Graphics g){
    super.paintComponent(g); 
    g.drawImage(Tetris.getTexture("LevelBackdrop.png"), 0, 0, null);
    System.out.println("paintComponent - level painted");
    g.setColor(new Color(255, 255, 0));
    g.drawString("2", 355, 55);
  }

  public int getLevelNum() {
    return levelNum;
  }

  public double getGravity(){
    return levelNum/4;
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    this.repaint();
    System.out.println("Timer repainting");
  }

}

从不打印“油漆组件级油漆”。“计时器重新绘制”每2秒打印一次,正如预期的那样。

共有1个答案

史旺
2023-03-14

调用重绘时,level对象的实际大小是多少?如果高度和宽度为零,则不会调用PaintComponent方法。由于您从不调用setPreferredSize(...),我认为这可能是原因。

如果这不能解决您的问题,请覆盖level中的repaint()方法,并中断它,查看它的实际操作(需要安装jdk)。

 类似资料:
  • 在试图制作一个非常简单的子弹地狱游戏来学习java时,我遇到了一个障碍: repaint()没有调用油漆组件()。 这是整个程序,目前只需将我每秒创建50次的图像绘制到JFrame上的JPanel上。 在使用断点和println方法进行了一些调试之后,我可以确认正在读取正确的图像,gameTimerAction中的计时器每秒被调用50次,并且repaint()根本没有调用paintComponen

  • 对于我的程序,我目前希望使用open按钮打开JFileChooser并选择一个图像,然后在applet左侧的JPanel上绘制它,我知道该文件正在被检索,但当我重新绘制图形上下文时,什么也没有发生。提前谢了。

  • 我已经花了几天时间试图让Graphics2D类在我的代码中工作。我把它的结构化为这样一种方式,即当注册了一个单击事件时,调用reaint()就完成了,但是当它到达调用repaint()的阶段时,这只会产生一个空指针异常。 调试时,这一切都在按预期工作,而不是从油漆组件方法中调用,但是当试图使用油漆组件和reaint()正确调用代码以允许Graphics2D类显示每个点的行时,它不起作用。 我已经包

  • 基本上,我有一个接口形状,它具有和方法。绘制形状的每个类都实现了这一点。还有一个类包含这些形状类的。然后有一个单独的类包含我的JFrame。我有一个“动画”按钮,它调用中的所有方法。

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非

  • 我试图在Java中创建一个简单的动画,显示一个蓝色的球在一个500 x 500的窗口中水平移动。球应该以1px/30ms的速度移动。问题是,窗口只有在时循环退出时才被绘制,而不是在我想要的时循环的每次迭代中。这导致蓝色的球被绘制在它的最终位置。你能告诉我我在这里做错了什么吗?我也尝试过在EDT上使用绘画组件()方法执行这段代码,得到了同样的结果。此外,正如其他帖子所建议的,当使用EDT和绘画组件(