java - 单击 GUI 时 JButton 消失

标签 java swing jframe paint actionlistener

我正在用java制作跳棋,当我点击GUI时“新游戏”按钮消失了。当我将鼠标悬停在其上方时,它会重新出现,但如果单击 GUI,它会再次消失。你知道我做错了什么吗?

public void setFrame()
    {
        boardSize  = 10;
        squareSize = 50;
        int imageSize = boardSize * squareSize;       
        image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB);
        imageIcon = new ImageIcon(image);
        jLabel = new JLabel(imageIcon);
        button = new JButton("New Game");
        button.setFocusable(false);
        button.setBounds(375, 5, 100, 20);
        pnl = new JPanel();
        pnl.setBounds(400, 10, 200, 100);
        pnl.setLayout(null);
        pnl.add(button);

        jFrame = new JFrame("Checker Board");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(jLabel, BorderLayout.CENTER);
        jFrame.add(pnl);
        jFrame.setSize(506, 558);
        jFrame.setResizable(false);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);

        jFrame.validate();
    }

    /**
     * Paint the checker board onto the Image.
     */
    public void paint()
    {
        Graphics graphics = jFrame.getGraphics();

        pnl.paint(graphics);
        button.paint(graphics);

        graphics.setColor(Color.black);
        Font font = new Font("Score", Font.BOLD, 20);
        graphics.setFont(font);
        graphics.drawString("Score: ", 150, 47);
        graphics.drawString("Turn: ", 20, 47);
        graphics.setFont(font.deriveFont(0, 16.0F));
        graphics.drawString("Red: " + Game.score.getScoreRed() + "    Black: " + Game.score.getScoreBlack(), 230, 47);
        graphics.drawString((Game.redTurn ? "Red" : "Black"), 80, 47);

        // paint a red  board
        graphics.setColor(Color.red);
        graphics.fillRect(xShift, zShift, boardSize * squareSize, boardSize * squareSize);

        // paint the black squares
        graphics.setColor(Color.black);
        for (int row = 0; row < boardSize; row++)
        {
            for (int col = row % 2; col < boardSize; col += 2)
            {
                graphics.fillRect( row * squareSize + xShift, col * squareSize + zShift, squareSize, squareSize );
            }
        }

        for(int i = 0; i < 10; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                if(Game.board.pieces[i][j] != null)
                {
                    Color pieceColor = Game.board.pieces[i][j].getColor().equals(EnumTeam.BLACK) ? Color.gray : Color.pink;
                    graphics.setColor(pieceColor);
                    graphics.fillOval((i * 50) + 10 + xShift, (j * 50) + 10 + zShift, 30, 30);
                    if(Game.board.pieces[i][j].isKing())
                    {
                        pieceColor = Game.board.pieces[i][j].getColor().equals(EnumTeam.BLACK) ? Color.darkGray : Color.magenta;
                        graphics.setColor(pieceColor);
                        graphics.fillOval((i * 50) + 20 + xShift, (j * 50) + 20 + zShift, 10, 10);
                    }
                }
            }
        }

        graphics.setColor(Color.cyan);
        drawRect(graphics, Game.board.getSelectedX(), Game.board.getSelectedZ(), 5);
    }

最佳答案

永远不要使用Graphicsgraphics = jFrame.getGraphics();(或者通常是getGraphics)!这不是 Swing 中自定义绘制的方式。您清除图形上下文这一事实本身就是您的核心问题。

所有绘制都应该在绘制 API 的上下文中完成,最好通过从扩展 JComponent 的任何组件中重写 paintComponent (我个人更喜欢 JPanel )

创建一个自定义组件并使用它来执行自定义绘画。将其与框架上的其他组件一起布局。

设置Performing Custom PaintingPainting in AWT and Swing有关 Swing 中绘画工作原理的更多详细信息。

MouseListener 并不是真正适合用于按钮的监听器,更好的选择是使用考虑鼠标单击和键盘事件的 ActionListener 。 .

参见How to write an Action ListenerHow to use buttons了解更多详情...

关于java - 单击 GUI 时 JButton 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18938314/

相关文章:

java - 如何将 Observable<byte[]> 转换为 Observable<String>?

java - 如何改进 JLabel 的渲染?

java - 使用鼠标事件在 JPanel 中拖动 JLabel

java - 较小的 JFrame/Applet 上的大图像

java - J框架;首先显示 for 循环中的数组元素 [1],而不是 [0]

java - Jpanel 放置在另一个面板的同一位置

java - 循环中的 if 语句中的 i-- 做什么?

java - 如何检查类是否有方面添加的方法?

java - 检测异步 JMS MessageConsumer 何时出现异常?

java - 无法取消 WorkerThread 。取消函数什么时候执行,仍然执行