首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的棋盘不出现?用java创建游戏

为什么我的棋盘不出现?用java创建游戏
EN

Stack Overflow用户
提问于 2015-03-08 14:46:55
回答 1查看 75关注 0票数 0

首先,我想说,我知道我要求很多,所以任何帮助都会感谢,我感谢您的时间。我非常感激。

无论如何,我正在为我的A2课程创建一个游戏,最常见的名字是Checker。我已经完成了我的代码,所有事情都按照我的计划工作,除了CheckerBoard本身和棋盘似乎没有显示。

被我的版面应该在场只是一个黑色的空间。虽然我的板似乎没有显示,但我在上面执行的所有操作(如单击特定部分)都会产生计划的响应,尽管我已经检查了代码,但我无法确定我做错了什么。

无论如何,如果有人能发现我的错误,或者给我一些建议,我将非常感激。谢谢

当然,由于我不能上传我的整个代码,我会做一些片段,我认为问题可能在哪里,或者只是重要的部分。谢谢

代码语言:javascript
复制
CheckerBoard content = new CheckerBoard(); // Sets the CheckerBoard values into the content to be used in the next line
        application.setContentPane(content); // Container holds the values together, Content pane of the CheckerBoard
        application.pack();  // Use preferred size of content to set size of application.
        Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
        application.setLocation( (screensize.width - application.getWidth())/2,
                (screensize.height - application.getHeight())/2 );
        application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); // Sets so that the application can be exited when the application is closed
        application.setResizable(false);  // This makes it so that the user can't change the application's size.
        application.setVisible(true); // Sets it so that the application can actually be seen

上面的代码放置在一个“公共静态空主(String[] args)”中。

下面我有:

代码语言:javascript
复制
public CheckerBoard()  {
// This is going to be a constructor, this constructor will set the layout manager for the panel to be null, it will then add components to the panel
// and it will set their bounds.

    setLayout(null);  // So that it will match my requirement specification, I will do the layout myself
    setBackground(new Color(0,120,0));  // Dark Green Background colour.
    setPreferredSize(new Dimension(350,250)); // The size of the Panel

    BoardComplete checkerboardData = new BoardComplete();
    add(checkerboardData); // This will create the components and add them to the content pane
    add(NewGameButton);
    add(ResignButton);
    add(MessageDisplay);

 // I will now have to produce a method to set the position and size of each component by calling its setBounds() method
    checkerboardData.setBounds(20,20,164,164); // Sets the board dimensions
    NewGameButton.setBounds(210, 60, 120, 30); 
    ResignButton.setBounds(210, 120, 120, 30); 
    MessageDisplay.setBounds(20, 200, 350, 30); 
    }   

最后,我有一个名为BoardComplete的公共类,它包含与actionlistners等相关的所有代码。所用:

代码语言:javascript
复制
 BoardComplete() {
        setBackground(Color.BLACK);
        addMouseListener(this);
        ResignButton = new JButton("Resign");
        ResignButton.addActionListener(this);
        NewGameButton = new JButton("New Game");
        NewGameButton.addActionListener(this);
        MessageDisplay = new JLabel("",JLabel.CENTER);
        MessageDisplay.setFont(new  Font("Serif", Font.BOLD, 14));
        MessageDisplay.setForeground(Color.green);
        checkerboardData = new DataForCheckers();
        MakeaNewGame();
    }       

我知道这是一个很大的要求,但任何帮助都将是非常感谢的,我将非常感激。谢谢。

编辑由于注释:这是代码,我的油漆类:

代码语言:javascript
复制
    public void PaintCheckerBoard(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // This will draw a two-pixel black border around the edges of the canvas. 

        g.setColor(Color.black);
        g.drawRect(0,0,getSize().width-1,getSize().height-1);
        g.drawRect(1,1,getSize().width-3,getSize().height-3);

        // Draw the squares of the checkerboard and the checkers.

        for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 8; col++) {
                if ( row % 2 == col % 2 )
                    g.setColor(Color.LIGHT_GRAY);
                else
                    g.setColor(Color.GRAY);
                g.fillRect(2 + col*20, 2 + row*20, 20, 20);
                switch (checkerboardData.PieceLocation(row,col)) {
                case DataForCheckers.RED:
                    g.setColor(Color.RED);
                    g.fillOval(4 + col*20, 4 + row*20, 15, 15);
                    break;
                case DataForCheckers.BLACK:
                    g.setColor(Color.BLACK);
                    g.fillOval(4 + col*20, 4 + row*20, 15, 15);
                    break;
                case DataForCheckers.RED_KING:
                    g.setColor(Color.RED);
                    g.fillOval(4 + col*20, 4 + row*20, 15, 15);
                    g.setColor(Color.WHITE);
                    g.drawString("K", 7 + col*20, 16 + row*20);
                    break;
                case DataForCheckers.BLACK_KING:
                    g.setColor(Color.BLACK);
                    g.fillOval(4 + col*20, 4 + row*20, 15, 15);
                    g.setColor(Color.WHITE);
                    g.drawString("K", 7 + col*20, 16 + row*20);
                    break;
                }
            }
        }

        // If there is a game in progress, highlight the legal moves that the player can make.
        // It can be seen that in this process, LegalMoves is never null while a game is in progress     

        if (CheckerMatchInProgress) {
            /* First, draw a 2-pixel cyan border around the pieces that can be moved. */
            g.setColor(Color.cyan);
            for (int i = 0; i < LegalMoves.length; i++) {
                g.drawRect(2 + LegalMoves[i].fromCol*20, 2 + LegalMoves[i].fromRow*20, 19, 19);
                g.drawRect(3 + LegalMoves[i].fromCol*20, 3 + LegalMoves[i].fromRow*20, 17, 17);
            }
            // If a piece is selected to be moved, for example if ChosenRow>=0, then
            // draw a 2-pixel white border around that piece, and draw a green border
            // around each square that the piece can be legally moved to.

            if (ChosenRow >= 0) {
                g.setColor(Color.white);
                g.drawRect(2 + ChosenColumn*20, 2 + ChosenRow*20, 19, 19);
                g.drawRect(3 + ChosenColumn*20, 3 + ChosenRow*20, 17, 17);
                g.setColor(Color.green);
                for (int i = 0; i < LegalMoves.length; i++) {
                    if (LegalMoves[i].fromCol == ChosenColumn && LegalMoves[i].fromRow == ChosenRow) {
                        g.drawRect(2 + LegalMoves[i].toCol*20, 2 + LegalMoves[i].toRow*20, 19, 19);
                        g.drawRect(3 + LegalMoves[i].toCol*20, 3 + LegalMoves[i].toRow*20, 17, 17);
                    }
                }
            }
        }

    }  // end PaintCheckerBoard()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-09 05:36:04

因此,查看另一个站点上的代码,您的自定义绘制方法似乎从未从任何地方被调用。您应该从组件类重写paintComponent方法(JPanel是组件的子类)。这个paintComponent方法将在swing思考时被调用,或者被告知重新绘制一些东西。

因此,将此代码添加到您的BoardComplete类:

代码语言:javascript
复制
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    PaintCheckerBoard(g);
} 

super.paintComponent会做任何swing来绘制这个组件(此时它只是绘制背景)。然后将Graphics对象传递给您自己的自定义画图方法,该方法将在Graphics对象上绘制您的整个游戏,swing将显示为您绘制的任何内容。

因此,现在您必须记住,每次游戏中的某些内容发生变化时,都要调用repaint()。tells ()方法只会告诉swing他应该重新绘制一些东西(注意:这告诉awt线程它应该重新绘制组件,所以它发生在调用tells()的位置)。

如果您仍然感到困惑,您可能应该查找一些有关如何使用此方法使用awt/swing绘制的信息或教程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28927731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档