Java 图形不会更新

标签 java swing graphics awt

我目前正在制作一款基于 Java 的西洋跳棋游戏 我有大量的调试代码证明存储每个部分的数组正在更新,但由于某种原因图形没有改变。 我的主要类(class):

 public class CheckersGui extends JPanel{
    //private List<Piece> Pieces = new ArrayList<Piece>();
    public Piece[][] pieces = new Piece[8][8];

public CheckersGui(){

    pieces[0][1] = new Piece(0,100,0);
    pieces[1][0] = new Piece(100,0,0);
    pieces[2][1] = new Piece(200,100,0);
    pieces[3][0] = new Piece(300,0,0);
    pieces[4][1] = new Piece(400,100,0);
    pieces[5][0] = new Piece(500,0,0);
    pieces[6][1] = new Piece(600,100,0);
    pieces[7][0] = new Piece(700,0,0);

    pieces[0][7] = new Piece(0,700,1);
    pieces[1][6] = new Piece(100,600,1);
    pieces[2][7] = new Piece(200,700,1);
    pieces[3][6] = new Piece(300,600,1);
    pieces[4][7] = new Piece(400,700,1);
    pieces[5][6] = new Piece(500,600,1);
    pieces[6][7] = new Piece(600,700,1);
    pieces[7][6] = new Piece(700,600,1);


    // create application frame and set visible
    //
    JFrame f = new JFrame();
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(this);
    f.setResizable(true);
    f.setSize(820, 850);

    // add mouse listeners to enable drag and drop
    //
    MyMouseListener listener = new MyMouseListener(this.pieces,
            this);
    this.addMouseListener(listener);


}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.clearRect(0, 0, 800, 800);

    System.out.println("PAINT COMPONENT");
//      for (Piece p[] : pieces) {
//          for (Piece s : p) {
//              System.out.print(s);
//          }
//          System.out.println();
//      }
    BufferedImage board = null, crown=null;
    try {   board = ImageIO.read(new File("src/bobreedhere/Checkers/assets/board3.png"));
            crown = ImageIO.read(new File("src/bobreedhere/Checkers/assets/crown.png"));} 
    catch (IOException e){}

    g.drawImage(board, 0,0,null);

    for (Piece p[] : pieces) {
        for (Piece s : p) {
            System.out.print(s);
            if(s!=null){
                if (s.getColor() == 0)
                    g.setColor(Color.BLACK);
                else
                    g.setColor(Color.WHITE);

                g.fillOval(s.getX(), s.getY(), 100, 100);

                if (s.isKinged())
                    g.drawImage(crown, s.getX(), s.getY(), null);
            }
        }
        System.out.println();
    }

}

public static void main(String args[]){
    new CheckersGui();

}

}

这是我的鼠标事件类。老实说,我不知道这有什么问题,所以我认为信息越多越好

public class MyMouseListener implements MouseListener{

Piece[][] pieces;
private CheckersGui checkersGui;
private boolean pieceSelected;
private Piece selectedPiece;

public MyMouseListener(Piece[][] pieces, CheckersGui chessGui) {
    super();
    this.pieces = pieces;
    this.checkersGui = chessGui;
}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("CLICK");
    System.out.println(pieces[e.getPoint().x/100][e.getPoint().y/100]);
    //System.out.println(e.getPoint().x/100+" : "+e.getPoint().y/100);
    if(!pieceSelected){
        //System.out.println("NADA");
        if(pieces[e.getPoint().x/100][e.getPoint().y/100]!=null){
        selectedPiece = pieces[e.getPoint().x/100][e.getPoint().y/100];
        pieceSelected = true;

        }
    }else{
        //System.out.println("EYO");
        if(pieces[e.getPoint().x/100][e.getPoint().y/100]==null){
            pieces[e.getPoint().x/100][e.getPoint().y/100]=selectedPiece;
            pieces[selectedPiece.getX()/100][selectedPiece.getY()/100]=null;
            pieceSelected=false;

        }
    }
    System.out.println(checkersGui.pieces[e.getPoint().x/100][e.getPoint().y/100]);

    checkersGui.repaint();
    checkersGui.paintComponent(checkersGui.getGraphics());

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

}

我只是不明白为什么棋子数组正在改变并且paintComponent方法正在运行,但棋子根本不移动。

example the board before and after I move a piece

最佳答案

你的问题是因为当你绘制这些碎片时,你使用了存储在其中的xy值。然而,当你移动棋子时,你永远不会更新它们;您只需将它放在数组中的新位置,同时它仍然包含其旧位置。

要解决此问题,您应该在移动时更新这些值,或者(不太可能中断),从数组中的位置而不是从存储在片段中的值找出正确的绘制位置.

关于Java 图形不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37638050/

相关文章:

java - GradlecompileTestJava 在 gradle clean 构建期间失败

java - 不将对象的实例分配给变量是不好的做法吗?

graphics - 如何测试线段是否与二维轴对齐矩形相交?

opengl - glLoadIdentity() 在 OpenGL 中做什么?

java - 项目 9 : "Always override hashCode() when you override equals"

java - 函数返回结果但给出错误

java - SSL 套接字连接

java - 无法在 jtextarea 中选择突出显示的文本

java - 在类中使用 addKeyListener 来监听另一个类的按键?

即使我将 JPanel 添加到 JFrame,Eclipse 上的 Java 也不会显示 JPanel