【发布时间】: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