2

作成しようとしているチェス ゲームがrepaint()あり、ゲーム ループ内の JFrame の 1 つでメソッドを呼び出そうとしています。この特定の JFrame は、各プレイヤーの合計キル数を示しています。実際に呼び出されていることは確かrepaint()ですが、何らかの理由で、各プレイヤーのキル数を保持するはずの JLabels が正しく更新されていないようです。

キルを表す JLabels を格納するカスタム JFrame 拡張クラスのコードを次に示します。

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);
}

次に、別のクラスのメイン メソッドでこのフレームの 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);

    }

}

どんな助けでも大歓迎です。

4

1 に答える 1

1

メインスレッドを「スリープ」しようとしているときにエラーが発生します。GUI が応答しなくならない限り、エラーが発生する可能性があります。あなたの最善の策は、swing.Timer クラスを使用することです (チュートリアルはこちらhttp://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html )。repaint() のイベントを定期的に発生させます。これにより、滑らかなアニメーションが得られます。

何らかの理由で、swing プログラムでスレッドスリープ状態にする必要がある場合は、SwingWorker クラスを使用して新しいスレッドを作成します (それ以外の場合はそうではありません)。http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#process(java.util.List )を参照してください

于 2012-06-25T08:23:26.510 に答える