Java - JFrame 在调用时不更新

标签 java swing user-interface paintcomponent

在开始之前先介绍一下背景,我正在做的是制作一个国际象棋游戏,除了游戏的分数之外,我所有的东西都按照我想要的方式工作。我在一个名为 Board 的类中有一个方法,并且在该类中我有一个名为 updateScore() 的方法。

private void updateScore(){
            int whitePawn = 0;              int blackPawn = 0;
            int whiteKnight = 0;            int blackKnight = 0;
            int whiteBishop = 0;            int blackBishop = 0;
            int whiteCastle = 0;            int blackCastle = 0;
            int whiteQueen = 0;             int blackQueen = 0;
            int whiteKing = 0;              int blackKing = 0;

            for(int k = 0; k < 8; k++){     //Checks through the board to see what pieces are on it.
                    for(int l = 0; l < 8; l++){
                    if(gameBoard[k][l] == 11){
                            whitePawn++;    //increments the vales how many of a certain pieces are on the board.
                    }
                    if(gameBoard[k][l] == 12){
                            whiteCastle++;
                    }
                    if(gameBoard[k][l] == 13){
                            whiteKnight++;
                    }
                    if(gameBoard[k][l] == 14){
                            whiteBishop++;
                    }
                    if(gameBoard[k][l] == 15){
                            whiteQueen++;
                    }
                    if(gameBoard[k][l] == 16){
                            whiteKing++;
                    }
                    if(gameBoard[k][l] == 21){
                            blackPawn++;
                    }
                    if(gameBoard[k][l] == 22){
                            blackCastle++;
                    }
                    if(gameBoard[k][l] == 23){
                            blackKnight++;
                    }
                    if(gameBoard[k][l] == 24){
                            blackBishop++;
                    }
                    if(gameBoard[k][l] == 25){
                            blackQueen++;
                    }
                    if(gameBoard[k][l] == 26){
                            blackKing++;
                    }
                    }

            }

            if(whiteKing == 0){     //No white king? Checkmate.
                    checkMate(1);
            }
            else if(blackKing == 0){ //No black king? Checkmate.
                    checkMate(2);
            }

            score = new Scores();
            score.showScores(whitePawn, blackPawn);
    }

我还有另一个名为 Scores 的类,它初始化另一个 JFrame 以显示游戏得分,如下所示:

Game board ans score window

分数类如下:

    import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class Scores extends JFrame{

    private int width = 300;
    private int height = 400;
    int whitePawn = 0;
    int blackPawn = 0;

    public Scores(){

        int a = this.getWidth();
        setSize(width, height);
        setTitle("Chess - Scores");
        setIconImage(new ImageIcon("imgs/chess-icon.png").getImage());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLocation(a+25,50);

        JPanel p = new JPanel();
        getContentPane().add(p);

        this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));
        Box horizontalBox;
        //showScores(whitePawn, blackPawn);

    }


    public void paintComponent(Graphics g){
        super.paintComponents(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.WHITE);
    }

    public void showScores(int wp, int bp){
        whitePawn = wp;
        blackPawn = bp;
        JLabel white_pawn = new JLabel("White Pawn: "+wp+" ", JLabel.CENTER);
        JLabel black_pawn = new JLabel("White Pawn: "+bp+" ", JLabel.CENTER);

        add(white_pawn, Box.createHorizontalGlue());
        add(Box.createRigidArea(new Dimension(9, 0)));
        add(black_pawn, Box.createHorizontalGlue());
        add(Box.createRigidArea(new Dimension(9, 0)));
        revalidate();
        repaint();
    }

}

但是出现的问题是,调用该方法时窗口永远不会更新?谁能提供解决方案吗?

最佳答案

您确实意识到 JFrame 没有 paintComponent 方法,对吗?所以你没有凌驾于任何事情之上。如果您想使用 paintComponent

,则应使用 JPanel

此外,这是否可能是范围问题?是否有任何其他组件依赖于 whitePawn、whiteKing 等 变量?因为它们都是本地范围的。无论调用该方法多少次,变量始终从 0 开始

关于Java - JFrame 在调用时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707760/

相关文章:

java - J面板: layout help needed

jquery表格列滑动效果

android - 如何在 Android 应用程序上自动切换到黑暗模式?

java - 通过动画过渡动态更改背景颜色

用于 Graph 网络可视化的 Java Graph 库

java - 我的二维数组被零填充,而不是随机数

java - 为什么 Jlist 选择索引 0,即使该项目不存在

java - GeoTools - 如何使用 GeoTools 类进行航位推算和类(class)计算

getProgress() 和 getNewValue() 之间的 Java 区别

java - 如何在JAVA中添加鼠标监听器?