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

标签 java swing graphics tic-tac-toe

这是我目前在游戏中遇到的问题。这是一种用户和 friend 可以一起玩的井字游戏。我还没有完成,但这就是我所得到的。每当窗口最小化或被另一个窗口覆盖时,绘制的图形部分(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. 不要使用getGraphics();

  2. 您需要了解如何在 Swing 中完成自定义绘制。跑通Performing Custom Painting 。您会注意到,绘制需要使用 paintComponent 方法(在您的 JPanelJComponent 类中),该方法接受用于执行自定义绘制的 Graphics(为您创建的)上下文。所有的绘画都应该在这个背景下完成。

    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);
        }
    } 
    

关于java - 如果屏幕最小化,如何防止Java删除内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23419889/

相关文章:

c# - 为什么需要处理图形?

java - 未调用 JAXB ValidationEventHandler 的 handleEvent 方法

java - 如何在 Spring Webflux 中获取引荐来源网址?

java - Spring启动Jsp文件找不到

java - JTable如何选择多行?

java - 适用于早期 Java 版本的 Sun Java 教程?

java - 如何让 "jvisualvm Threads Inspector"工作?

java - 如何在JPanel中设置背景图片

opengl - 将我的场景渲染到帧缓冲区对象(FBO)然后将该 FBO 渲染到屏幕所需的步骤是什么?

java - 为什么这个 JMenu 会显示在这个 JPanel 上?