Java 为什么我的绘制方法中没有更新我的字符串?

Java 为什么我的绘制方法中没有更新我的字符串?,java,swing,awt,Java,Swing,Awt,我试图在我的网格系统中改变位置(0,1)处的文本,但由于某种原因,它之前的数字保持不变,所以如果我将它从0改为1,它是一个0,1重叠。我的代码出了什么问题导致了这种情况 主要类别: package Tetris; import java.awt.Color; import javax.swing.JFrame; class Tetris { JFrame frame; public Tetris() { frame = new JFrame("Tetris

我试图在我的网格系统中改变位置(0,1)处的文本,但由于某种原因,它之前的数字保持不变,所以如果我将它从0改为1,它是一个0,1重叠。我的代码出了什么问题导致了这种情况

主要类别:

package Tetris;

import java.awt.Color;
import javax.swing.JFrame;

class Tetris {

    JFrame frame;

    public Tetris() {
        frame = new JFrame("Tetris");
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setResizable(false);
        //frame.setLocationRelativeTo(null);
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Board(frame));
    }

    public static void main(String[] args) {
        new Tetris();
    }
}
游戏类别:

package Tetris;

import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel {

    private static final long serialVersionUID = -5635526290001171288L;

    private int[][] boardLayout;
    private int[] piecePos;

    private float timerCount = 0.0f;

    private String boardLayoutString;

    private Timer timer;

    public Board(JFrame frame) {
        timer = new Timer(10, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                update();
            }
        });
        timer.start();

        boardLayout = new int[8][16];
        piecePos = new int[] { 1, 0 };
        boardLayoutString = "";

        for(int y = 0; y < 16; y++) { // grid system
            for(int x = 0; x < 8; x++) {
                boardLayout[x][y] = 0;
                if(x == 7) {
                    boardLayoutString += boardLayout[x][y] + "\n";
                } else {
                    boardLayoutString += boardLayout[x][y] + " ";
                }
            }
        }

        frame.addKeyListener(new KeyListener() { // maybe put this somewhere else
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    System.exit(0);
                }
                if(e.getKeyCode() == KeyEvent.VK_Q) {
                    boardLayout[1][0] = 2;
                }
            }
            public void keyReleased(KeyEvent e) {
                //
            }
            public void keyTyped(KeyEvent e) {
                //
            }
        });
    }

    private String boardLayoutToString(int[][] boardLayout) {
        boardLayoutString = "";
        for(int y = 0; y < 16; y++) { // grid system
            for(int x = 0; x < 8; x++) {
                if(x == 7) {
                    boardLayoutString += boardLayout[x][y] + "\n";
                } else {
                    boardLayoutString += boardLayout[x][y] + " ";
                }
            }
        }
        return boardLayoutString;
    }

    private void update() {
        timerCount += 0.01f; // every 10ms, add 0.01 - this means 1.0f = 1s

        if(timerCount >= 1.0f) { // do something every 1s           
//          if(piecePos[1] < 8) {
//              boardLayout[piecePos[0]][piecePos[1]] = 1;
//              piecePos[1]++;
//              if(piecePos[1] > 0) {
//                  boardLayout[piecePos[0]][piecePos[1] - 1] = 0;
//              }
//          } else {
//              piecePos = new int[] { 1, 0 };
//          }
            timerCount = 0.0f;
        }
    }

    public void paint(Graphics g) {
        //Graphics2D g2 = (Graphics2D) g;

        for(int i = 0; i < boardLayoutToString(boardLayout).split("\n").length; i++) {
            g.drawString(boardLayoutToString(boardLayout).split("\n")[i], 50, 50 + (i * 15));
        }
        repaint();
    }
}
package俄罗斯方块;
导入java.awt.Graphics;
导入java.awt.event.*;
导入javax.swing.*;
公共课程委员会扩展JPanel{
私有静态最终长serialVersionUID=-56355262900011788L;
专用int[][]板布局;
私人机构;
专用浮动时间计数=0.0f;
私有字符串boardLayoutString;
私人定时器;
公共板(JFrame){
计时器=新计时器(10,新ActionListener(){
已执行的公共无效操作(操作事件e){
更新();
}
});
timer.start();
boardLayout=新国际[8][16];
piecePos=新的int[]{1,0};
boardLayoutString=“”;
对于(int y=0;y<16;y++){//网格系统
对于(int x=0;x<8;x++){
boardLayout[x][y]=0;
如果(x==7){
boardLayoutString+=boardLayout[x][y]+“\n”;
}否则{
boardLayoutString+=boardLayout[x][y]+'';
}
}
}
frame.addKeyListener(newKeyListener(){//可能将其放在其他地方
按下公共无效键(按键事件e){
if(例如getKeyCode()==KeyEvent.VK_ESCAPE){
系统出口(0);
}
如果(例如getKeyCode()==KeyEvent.VK_Q){
boardLayout[1][0]=2;
}
}
公共无效密钥已释放(密钥事件e){
//
}
public void keyTyped(KeyEvent e){
//
}
});
}
专用字符串boardLayoutToString(int[][]boardLayout){
boardLayoutString=“”;
对于(int y=0;y<16;y++){//网格系统
对于(int x=0;x<8;x++){
如果(x==7){
boardLayoutString+=boardLayout[x][y]+“\n”;
}否则{
boardLayoutString+=boardLayout[x][y]+'';
}
}
}
返回boardLayoutString;
}
私有void更新(){
timerCount+=0.01f;//每10毫秒加0.01-表示1.0f=1s
如果(timerCount>=1.0f){//每1s做一次
//如果(工件位置[1]<8){
//板布局[piecePos[0]][piecePos[1]]=1;
//piecePos[1]++;
//如果(分段位置[1]>0){
//板布局[piecePos[0]][piecePos[1]-1]=0;
//              }
//}其他{
//piecePos=新的int[]{1,0};
//          }
时间计数=0.0f;
}
}
公共空间涂料(图g){
//图形2d g2=(图形2d)g;
对于(int i=0;i
该源代码有一些可疑的功能

  • 对于
    JComponent
    中的自定义绘制,请使用
    paintComponent(Graphics)
    而不是
    paint(Graphics)
  • 立即调用
    super.paintComponent(Graphics)
    清除上一张图纸。
  • 其他提示
  • 添加
    @Override
    符号以确保编译时检查
  • 不要从绘制方法调用
    repaint()
    ,而是从由Swing
    计时器控制的
    ActionListener
    调用它
  • 在添加组件后,将框架设置为可见

  • 谢谢,这很有效。:)我现在唯一的问题是背景色不起作用——大概是因为
    super.paintComponent(g)正在它上面绘制。我如何在没有画的情况下制作纯色背景色?确保你的组件是不透明的。我解决了背景色问题,别担心。你的回答很有帮助,谢谢。