【问题标题】:repaint() not calling paintComponent()repaint() 不调用paintComponent()
【发布时间】:2017-01-03 15:47:59
【问题描述】:

首先,请不要在存在其他名称和内容相似的问题时将我置于危险境地。我把它们都看了一遍,但没有找到解决办法。

调用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");
  }

}

“paintComponent - 绘制的级别”从不打印。正如预期的那样,“计时器重绘”每 2 秒打印一次。

【问题讨论】:

  • 你能把定时器去掉试试看,然后从关卡构造器中去掉那个 repaint()
  • 我建议 Swingworkers:stackoverflow.com/questions/782265/…
  • 我建议发布minimal reproducible example。就目前而言,无法重现您正在经历的事情,并且从发布的代码中似乎没有任何明显的(至少我看到的)。
  • "删除计时器试试,然后删除那个 repaint()。"不,那没有用。
  • Do you want me to post all the classes? All the code? 不 - 这不是“最小”。重点是 2 点: 1. 您在向志愿者寻求帮助 - 发布过多的代码很可能需要任何志愿者花费太多时间 2. 通常在创建 mcve 的过程中会发现问题(这就是调试的意义所在所有关于)

标签: java swing user-interface paintcomponent repaint


【解决方案1】:

调用重绘时level 对象的实际大小是多少?如果高度和宽度为零,则不会调用paintComponent 方法。既然你从不打电话给setPreferredSize(...),我想这可能是原因。

如果这不能解决您的问题,请覆盖Level 中的repaint() 方法并对其进行中断以查看其实际作用(需要安装jdk)。

【讨论】:

  • 如果您有任何问题,请在 cmets 中提问。不要发布问题作为答案。
  • 我认为你是对的。这可能是问题所在。在调用 repaint() 附近时,我执行了“System.out.println(this.getSize().getWidth() +”:“+ this.getSize().getHeight());”并且宽度和高度都为 0.0 不幸的是,setPrefferedSize() 没有做任何事情来解决这个问题。
  • 我使用了 setSize() 并且成功了!非常感谢 =)
  • 我已经有一段时间没有使用 swing 的东西了,但我记得setPreferredSize() 通常是一个更好的选择。不过,这需要一段时间才能弄清楚为什么它对您不起作用。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2013-12-13
  • 2022-12-17
相关资源
最近更新 更多