如果屏幕最小化,如何防止Java擦除内容?

时间:2014-05-02 02:36:10

标签: java swing graphics tic-tac-toe

这是我面对游戏时遇到的一个问题。这是一款Tic-Tac-Toe用户和朋友可以一起玩的游戏。我还没有完成,但这就是我所拥有的。只要窗口被最小化或被另一个窗口覆盖,绘制的图形部分(X和O)就会被删除。我真的不知道如何处理这个问题,有一种方法可以让图形不被删除。我的主类的paintComponent()方法只是设置了电路板的设计。 感谢任何帮助,谢谢!

private class DrawXO implements MouseListener {

    public void mousePressed(MouseEvent evt) {

        int x = evt.getX();
        int y = evt.getY();

        Graphics gContext = getGraphics();
        Graphics2D graphics = (Graphics2D) gContext;


        graphics.setStroke(new BasicStroke(8));
        if (playerOneTurn) {

            Player1.drawCircle(gContext, x, y );
            checkForWinner();

            if(playerOneWins) {
                System.out.println("Player one wins");
            }

            playerTwoTurn = false;
        } else {
            // Still need to implement drawing for this ~
            checkForWinner();

        }

    }

    public void mouseExited(MouseEvent evt) {}
    public void mouseEntered(MouseEvent evt) {}
    public void mouseClicked(MouseEvent evt) {}
    public void mouseReleased(MouseEvent evt) {}
}

1 个答案:

答案 0 :(得分:1)

  1. 请勿使用getGraphics();

  2. 您需要了解如何在Swing中完成自定义绘画。浏览Performing Custom Painting。您会注意到,绘画需要使用paintComponent方法(在JPanelJComponent类中),其中包含Graphics(已创建 > you)用于执行自定义绘制的上下文。所有绘画都应该在这种背景下完成。

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        // do painting here
    } 
    

    注意:永远不要明确调用此方法,它会自动调用

  3. 要更新图形,您将对某些绘制变量进行一些更新,然后调用repaint()。也许是这样的:

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        repaint();
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.fillRect(x, y, width, height);
    } 
    
  4. 如果要添加/绘制多个对象,比如单击鼠标,则保留List个对象,并在paintComponent方法中遍历列表。单击鼠标时,将另一个对象添加到列表并重新绘制。像

    这样的东西
    List<Rectangle2D> rectangles;
    ...
    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        rectangles.add(new Rectangle2d.Double(x, y, width, height);
        repaint();
    }
    ...
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (Rectangle2D rect: rectangles) {
            g2.fill(rect);
        }
    }