JFrame.revalidate()并生成一个灰色屏幕-Confusion



我在JPanel 中有一个方法

private void paintScore(Graphics2D g) {
    Font scoreFont = new Font("Arial", Font.PLAIN, 72);
    g.setFont(scoreFont);
    FontMetrics scoreFontMetrics = g.getFontMetrics();
    g.drawString("" + playerOneScore, SCREEN_WIDTH / 2 - 30
            - scoreFontMetrics.stringWidth("" + playerOneScore),
            SCREEN_HEIGHT / 2);
    g.drawString("" + playerTwoScore, SCREEN_WIDTH / 2 + 30,
            SCREEN_HEIGHT / 2);
}

当我调用这个方法时,它第一次出现工作。然后,在那之后,它就再也不起作用了。

如果我注释掉该方法的调用,那么它始终有效。

但是,如果我调用JFrame's revalidate()方法,该程序也会一直工作。

我不知道这里发生了什么。

如果需要,我可以发布完整的源代码。

提前感谢


这是代码的其余部分。

主JPanel扩展类。

       import java.awt.Color;
       import java.awt.Font;
       import java.awt.FontMetrics;
       import java.awt.Graphics;
       import java.awt.Graphics2D; 
       import java.awt.event.MouseEvent;
       import java.awt.event.MouseMotionListener;
       import java.awt.image.BufferedImage;
       import javax.swing.JFrame;
        import javax.swing.JPanel;
     public class GamePanel extends JPanel implements Runnable, MouseMotionListener {
private static final int SCREEN_WIDTH = 640;
private static final int SCREEN_HEIGHT = 480;
private static final int INDENT = 20;
private int playerOneScore = 0;
private int playerTwoScore = 0;
private ImageEntity playerOne = new ImageEntity("Images/bouncer.bmp");
private ImageEntity playerTwo = new ImageEntity("Images/bouncer.bmp");
private int mouseX = 0;
private int mouseY = 0;
private BufferedImage gameScreen = new BufferedImage(SCREEN_WIDTH,
        SCREEN_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D gameScreenGraphics = gameScreen.createGraphics();
public GamePanel() throws Exception {
    paintBackground(gameScreenGraphics);
    paintScore(gameScreenGraphics);
    paintBouncers(gameScreenGraphics);
}
public void run() {
}
public void mouseMoved(MouseEvent m) {
    mouseX = m.getXOnScreen();
    mouseY = m.getYOnScreen();
}
public void mouseDragged(MouseEvent m) {
}
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(gameScreen, 0, 0, this);
}
private void paintBackground(Graphics2D g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    g.setColor(Color.WHITE);
    for (int i = 0; i < 10; i++) {
        g.fillRect(SCREEN_WIDTH / 2 - 5, i * SCREEN_HEIGHT / 10, 10,
                (SCREEN_HEIGHT / 10) - 10);
    }
}
private void paintScore(Graphics2D g) {
    Font scoreFont = new Font("Arial", Font.PLAIN, 72);
    g.setFont(scoreFont);
    FontMetrics scoreFontMetrics = g.getFontMetrics();
    g.drawString("" + playerOneScore, SCREEN_WIDTH / 2 - 30
            - scoreFontMetrics.stringWidth("" + playerOneScore),
            SCREEN_HEIGHT / 2);
    g.drawString("" + playerTwoScore, SCREEN_WIDTH / 2 + 30,
            SCREEN_HEIGHT / 2);
}
private void paintBouncers(Graphics2D g) {
    g.drawImage(playerOne.getImage(), playerOne.getX(), playerOne.getY(),
            this);
    g.drawImage(playerTwo.getImage(), playerTwo.getX(), playerTwo.getY(),
            this);
}
public static void main(String[] args)throws Exception {
    JFrame mainPane = new JFrame("Pong - Mrinank Sharma");
    mainPane.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    mainPane.setVisible(true);
    mainPane.setResizable(false);
    GamePanel gp = new GamePanel();
    mainPane.add(gp);
    mainPane.revalidate();
}
  }

ImageEntity是一个类,它只是BufferedImage的包装器。

再次感谢各位

尝试这样做:

public GamePanel() {
    paintBackground(gameScreenGraphics);
    paintScore(gameScreenGraphics);
    paintBouncers(gameScreenGraphics);
    addMouseMotionListener(this);
    repaint();
}

您忘记添加鼠标运动侦听器,并重新绘制面板。重新验证();在这种情况下没有用。

最新更新