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

调用repaint()时JFrame不更新

傅元章
2023-03-14

我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用repain()方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。

这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。

private ChessGame game;
private JPanel killsPanel;
private String p1kills;
private String p2kills;
private JLabel kills;
private JLabel p1, p2;
private JLabel p1NumKills = new JLabel();
private JLabel p2NumKills = new JLabel();


//the player's kill values are increasing and registering, just not within the jlabels representing them
public KillsFrame(ChessGame game){
    this.game = game;
    killsPanel = new JPanel(new MigLayout("", "[center][right][left][c]", "[top][center][b]"));
    kills = new JLabel("KILLS");
    p1 = new JLabel(game.getCurrentPlayer().getName() + " - ");
    p2 = new JLabel(game.getOtherPlayer().getName() + " - ");

    //this is the part that should be working but isn't.
    //p1kills and p2kills aren't being updated or something.
    p1kills = "" + game.getCurrentPlayer().getKills();
    p2kills = "" + game.getOtherPlayer().getKills();
    p1NumKills.setText(p1kills);
    p1NumKills.setText(p2kills);

    killsPanel.add(kills, "span");
    killsPanel.add(p1);
    killsPanel.add(p1NumKills, "wrap");
    killsPanel.add(p2);
    killsPanel.add(p2NumKills, "wrap");

    killsPanel.setBackground(Color.lightGray);
    add(killsPanel);
    pack();
    setTitle("Scoreboard");
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setResizable(true);
    setVisible(true);
    setLocationRelativeTo(null);
}

然后我只是在不同类的main方法中调用这个框架的repaint():

public static void main(String[] args) throws InterruptedException {

    JFrame gameFrame = new ChessMain();
    gameFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    gameFrame.pack();
    gameFrame.setResizable(true);
    gameFrame.setLocationRelativeTo(null);
    gameFrame.setVisible(true); 
    gameFrame.setTitle("Chess X");

    LoginFrame loginFrame = new LoginFrame(((ChessMain) gameFrame).getGame());

    System.out.println(((ChessMain) gameFrame).getGame().toString());
    System.out.println(((ChessMain) gameFrame).getGame().currentPlayer.getName()+ ", it's your turn.");

    //this is what creates the kills frame.
    KillsFrame kf = new KillsFrame(((ChessMain) gameFrame).getGame());

    while(true){

        ((ChessMain) gameFrame).getGame().run();
        kf.repaint();//*************************************
        Thread.sleep(1);

    }

}

非常感谢您的任何帮助。

共有1个答案

荀俊迈
2023-03-14

当你试图“Hibernate”你的主线程时,你的错误就出现了。如果不使GUI无响应,这必然会导致错误。你最好用秋千。计时器类(此处为教程http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html). 定期触发事件以重新绘制()。这将产生平滑的动画。

如果由于某种原因,您必须在swing程序中Hibernate一个线程,请使用SwingWorker类创建一个新线程(而不是其他)。参见http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#process(java.util.列表)

 类似资料:
  • 问题内容: 我仍在学习Java,如果有人可以帮助我,我将非常高兴! 对不起,英语不好,我是西班牙人!我正在制作一个平铺游戏,该游戏使用了经典的“游戏循环”,该引擎以60fps的速度限制了引擎的速度。循环睡眠,然后调用repaint();。这样很好!但.. 问题在于,当调整JFrame的大小或使其最大化时,将调用repaint事件!例如,当JFrame最大化/调整大小时,游戏以10000fps的速度

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

  • 我正在编写一个程序,其中包括创建一个JFrame,并使用Graphics类中的< code>drawOval()在其中绘制一个圆。我遇到了一个问题,我试图在JFrame的中心创建一个点,然后用这个点作为圆的x和y坐标来画圆。以下是我目前为止的代码: 正如您在函数中看到的,我将JFrame的大小设置为500x500。但是,当绘制圆圈时,当我期望它们在调用后基于时,它们的x和y坐标是(0,0)。我哪里

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

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

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