Java- Cannot find symbol (swing)

2019-09-19 08:09发布

问题:

I have a Simon game that I'm working on, and I've been debugging for a while before moving on to finish. Just this one error left so far; Compiler (NetBeans IDE rather) reporting error; specifically "Cannot find symbol MenuPanel ; Class: BorderPanel". I know it is not within this class, but I'm not entirely sure how where to point it to. Relevant code below:

package simon;

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color.*;


/**
 *  Main Class
 * @author Chris Mailloux
 */
public class Simon
{
    // Variable declarations.
    public static final String[] colors = {"Green", "Red", "Yellow", "Blue"};
    public static ArrayList<String> pattern = new ArrayList<String>();
    public static int currentScore = 0;
    public static int iterator = 0;
    public static boolean isPlayerTurn = false;
    // PLACEHOLDER FOR HIGHSCORE RETRIEVAL FROM FILE
    public static int highScore = 0; // TEMPORARY

    public static void main (String[] args)
    {
        GameWindow window = new GameWindow();
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

/**
 * Class for main game window.
 * @author Chris
 */
class GameWindow extends JFrame
{
    GameWindow()
    {
        // Set basic properties of frame.
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setTitle("Simon");
        setResizable(true);
        setLocation(DEFAULT_HORIZONTAL_LOCATION, DEFAULT_VERTICAL_LOCATION);
        // PLACEHOLDER FOR IMAGE ICON

        // Adding Menu Panel
        MenuPanel menuPanel = new MenuPanel();
        add(menuPanel);

        // Adding buttons panel.
        ButtonsPanel buttonsPanel = new ButtonsPanel();
        add(buttonsPanel);

        // Adding Border layout helper panel.
        BorderPanel borderPanel = new BorderPanel();
        add(borderPanel);

        // Setting grid layout (with spaces)
        buttonsPanel.setLayout(new GridLayout(2, 2, 20, 20)); 

        // Setting background color of main panel to black.
        buttonsPanel.setBackground(Color.black);
    }
    // Declaring window positioning constants.
    public static final int DEFAULT_WIDTH = 800;
    public static final int DEFAULT_HEIGHT = 800;

    // TEMPORARY PLACEHOLDER FOR SCREENSIZE CALCULATIONS
    public static final int DEFAULT_HORIZONTAL_LOCATION = 0;
    public static final int DEFAULT_VERTICAL_LOCATION = 0;
}

/**
 * Class to hold the buttonsPanel
 * @author Chris
 */
class ButtonsPanel extends JPanel
{
    public static JButton greenButton = new JButton();
    public static JButton redButton = new JButton();
    public static JButton yellowButton = new JButton();
    public static JButton blueButton = new JButton();

    ButtonsPanel()
    {
       // Setting background color of buttons.
       greenButton.setBackground(Color.GREEN);  // NEED COLOR CONSTANTS
       redButton.setBackground(Color.RED);  
       yellowButton.setBackground(Color.YELLOW);    
       blueButton.setBackground(Color.BLUE);

       // Add buttons to panel. (In order)
        add(greenButton);
            add(redButton);
        add(yellowButton);
            add(blueButton);

       // Creating ActionListeners for 4 main buttons.
        ActionListener greenAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                greenClicked();
            }
        };

        ActionListener redAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                redClicked();
            }
        };

        ActionListener yellowAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                yellowClicked();
            }
        };

        ActionListener blueAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                blueClicked();
            }
        };

            // Associate actions with buttons.
        greenButton.addActionListener(greenAction);
        redButton.addActionListener(redAction);
        yellowButton.addActionListener(yellowAction);
        blueButton.addActionListener(blueAction);
    }

        // Handling button activations.
        public static void greenClicked()
        {
            // TODO
        }

        public static void redClicked()
        {
            // TODO
        }

        public static void yellowClicked()
        {
            // TODO
        }

        public static void blueClicked()
        {
            // TODO
        }
}
/**
 * Menu buttons panel.
 * @author Chris Mailloux
 */
class MenuPanel extends JPanel
{
    public MenuPanel()
    {
        setBackground(Color.BLACK);

        // Menu panel buttons.
        JButton startButton = new JButton("Start");
        JButton scoreDisplay = new JButton(String.valueOf(Simon.currentScore));
        JButton highScoreDisplay = new JButton(String.valueOf(Simon.highScore));
        add(startButton);
        add(scoreDisplay);
        add(highScoreDisplay);
        scoreDisplay.setBackground(Color.BLACK);
        highScoreDisplay.setBackground(Color.BLACK);
        startButton.setBackground(Color.BLUE);
        scoreDisplay.setEnabled(false);
        scoreDisplay.setEnabled(false);
        // ActionListeners for menu buttons.
        ActionListener startButtonAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                Game.startGame();
            }
        };
        startButton.addActionListener(startButtonAction);
    }
 }

/**
 * Border Panel support class.
 * @author Chris Mailloux
 */
class BorderPanel extends JPanel
{
    BorderPanel()
    {
        setLayout(new BorderLayout());
        add(menuPanel, BorderLayout.NORTH);
    }
}
/**
* Main game logic class.
* @author Chris
*/
class Game extends Simon // Extends to allow to inherit variables.
{
// Resets variables for new game.
public static void startGame()
{
    isPlayerTurn = false;
    pattern.clear();
    currentScore = 0;
    iterator = 0;
    gamePlay(); // Starts game
}

public static void gamePlay()
{
    if (isPlayerTurn = false)
    {
        computerTurn();
    }
    else
    {
        playerTurn();
    }
}

public static void computerTurn()
{
    ButtonsPanel.greenButton.setEnabled(false);
    ButtonsPanel.redButton.setEnabled(false);
    ButtonsPanel.yellowButton.setEnabled(false);
    ButtonsPanel.blueButton.setEnabled(false);
    iterator = 0; // So CPU can use iterator to show pattern.
    int randInt = (int) Math.random() * 4;
    String randColor = colors[randInt];
    pattern.add(new String(randColor));
    showPattern();
}

public static void playerTurn()
{
    iterator = 0;
    ButtonsPanel.greenButton.setEnabled(true);
    ButtonsPanel.redButton.setEnabled(true);
    ButtonsPanel.yellowButton.setEnabled(true);
    ButtonsPanel.blueButton.setEnabled(true);
}

/**
 * Handles scoring and checks inputs for correctness.
 * @author Chris Mailloux
 */
public static void check()
{
    if(lastInput == pattern.get(iterator))
    {
        iterator++;
        if(iterator > currentScore)
        {
            currentScore++;
            if(currentScore > highScore)
            {
                highScore++;
                // PLACEHOLDER TO WRITE HIGHSCORE TO FILE.
            }
        }
    }
    else
    {
        gameOver();
    }
}

public static void showPattern()
{
    int j = 0;
    while (j < pattern.size())
    {
        String showerHelper = pattern.get(j); // Helper variable.
        switch (showerHelper)
        {
            case "Green" : ButtonsPanel.greenClicked();
            case "Red" : ButtonsPanel.redClicked();
            case "Yellow" : ButtonsPanel.yellowClicked();
            case "Blue" : ButtonsPanel.blueClicked();
            break; // Fallthrough handler.
            default: System.out.println("Error: Invalid value for pattern"
                    + " ArrayList, or improper storage of variable in the"
                    + " showerHelper variable.");
        }
        j++;
    }
}

    public static void gameOver()
    {
        // TODO
    }
}

回答1:

In your class BorderPanel you're using a variable menuPanel that ... doesn't exist.

add(menuPanel, BorderLayout.NORTH);

That's why it's telling you that it's a missing symbol.

Perhaps you meant to create a new instance of MenuPanel?

add(new MenuPanel(), BorderLayout.NORTH);


回答2:

If your posted code is complete, then you most likely need an import statement for the missing class.

import <path-to-borderpanel>.BorderPanel;

It looks like from your code that BorderPanel (along with the others) may be in the default package (i.e. - no package statement at the top of the file in which they are defined). In that case, you will need to put them in a package in order for them to be accessible to other, non-default packages. If you place them in the simon package, then you won't need to import them at all.