Creating more than one frame unnecessarily

I am working on Java project which is game for children. I have menu class which has main method as well, I have Board class which extends JPanel and has game GUI in it, I have Player class which has movement methods of player. I designed whole menu in menu class which extends jframe, I have all actions and events in one frame which is Menu object, so I use lots of repaint() and validate() method to change JPanels in my main frame. It works well for some but when I want to add game panel for user to start the game which is Board object in my design. There is one more frame created unnecessarily. In my menu first user sees a panel which I called startingPanel in my code has "Start game button", "Top Scores", "Credits" and "Exit" buttons. Then user clicks start the game, then userNamepanel comes and user enter his/her name, then he/she starts the game by using start the game button which removes userNamePanel and adds Board to the frame. But problem occurs, java opens Board panel in that frame but simultaneously it creates a new Menu frame instance and I have 2 frames in screen one shows Board panel the other shows starting panel. So how can I get rid of this extra frame? So here is my code; Firstly Board class

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

public class Board extends JPanel implements ActionListener {



    private Timer timer;
    private Player player;
    private final int DELAY = 10;
    private Image image;
    private JLabel label;
    private JPanel panel;
    private JButton button1, button2;
    private int mapNumber;
    private boolean talkProfessor = false;
    private ImageIcon front = new ImageIcon("player_front.png");
    private ImageIcon left = new ImageIcon("player_left.png");
    private ImageIcon right = new ImageIcon("player_right.png");
    private ImageIcon back = new ImageIcon("player_back.png");
    private ImageIcon front2 = new ImageIcon("player_front2.png");
    private ImageIcon left2 = new ImageIcon("player_left2.png");
    private ImageIcon right2 = new ImageIcon("player_right2.png");
    private ImageIcon back2 = new ImageIcon("player_back2.png");
    private ImageIcon front3 = new ImageIcon("player_front3.png");
    private ImageIcon left3 = new ImageIcon("player_left3.png");
    private ImageIcon right3 = new ImageIcon("player_right3.png");
    private ImageIcon back3 = new ImageIcon("player_back3.png");




    public Board() {

        initBoard();





    }

    private void initBoard() {

        setPreferredSize(new Dimension(900,900));
        image = Toolkit.getDefaultToolkit().createImage("map4.png");
        mapNumber = 4;

        addKeyListener(new TAdapter());
        setFocusable(true);

        player = new Player();

        timer = new Timer(DELAY, this);
        timer.start();      

    }

    public Image getImage(){
        return image;
    }


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(image,0,0,null);

        doDrawing(g);       
    }

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;   
        g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);

    }



    public void actionPerformed(ActionEvent e) {

        player.move();


        if(((player.getY() == 350 && mapNumber == 1) && (player.getX() <= 500 && player.getX() >= 400)) ){
            JOptionPane.showMessageDialog(null,"" +  
                " ");       
            player.setdY(0);
            player.setY(player.getY() + 50);
        }

        if((player.getX() == 350 && mapNumber == 1) && (player.getY() <= 500 && player.getY() >= 400)){
            JOptionPane.showMessageDialog(null,"");
            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getY() == 750 && mapNumber == 2) && (player.getX() <= 500 && player.getX() >= 400)){
            JOptionPane.showMessageDialog(null,"" + 
                "");
            player.setY(player.getY() - 50);
            player.setdY(0);
            talkProfessor = true;
        }

        if((player.getY() == 500 && mapNumber == 3) && (player.getX() <= 500 && player.getX() >= 400)){
            JOptionPane.showMessageDialog(null,"" + 
                "  " + 
                    "");

            player.setY(player.getY() - 50);
            player.setdY(0);
        }

        if((player.getY() == 400 && mapNumber == 3) && (player.getX() <= 280 && player.getX() >= 270)){
            JOptionPane.showMessageDialog(null,"");
            player.setY(player.getY() + 10);
            player.setdX(0);
            player.setdY(0);            
        }


        if((player.getX() == 200 && mapNumber == 4) && (player.getY() <= 500 && player.getY() >= 400)){
            if(talkProfessor){
                JOptionPane.showMessageDialog(null,"" + 
                " ");

            }
            else
            JOptionPane.showMessageDialog(null,"" + 
                " ");
            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getX() == 100 && mapNumber == 5) && (player.getY() <= 500 && player.getY() >= 400)){
            JOptionPane.showMessageDialog(null," " +
                "");

            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getY() == 400 && mapNumber == 101) && player.getX() <= 50){
            JOptionPane.showMessageDialog(null,"");

            player.setX(player.getX() + 50);
            player.setdY(0);

        }

        if((player.getX() >= 800 && mapNumber == 101) && player.getY() == 420){
            player.setX(player.getX() - 50);
            player.setdX(0);
            player.setdY(0);

            JOptionPane.showMessageDialog(null," ");

        }

        if(player.getX() == 850 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map2.png");
            player.setX(10);
            mapNumber = 2;
        }

        if(player.getX() == 0 && mapNumber == 2){
            image = Toolkit.getDefaultToolkit().createImage("map.png");
            player.setX(840);
            mapNumber = 1;
        }

        if((player.getX() == 240 && mapNumber == 2) && player.getdX() == 1){
            player.setImage(front2, left2, right2, back2);
        }

        if((player.getX() == 200 && mapNumber == 2) && player.getdX() == -1){
            player.setImage(front, left, right, back);
        }


        if(player.getY() == 0 && mapNumber == 3){
            image = Toolkit.getDefaultToolkit().createImage("map4.png");
            player.setY(840);
            mapNumber = 4;
        }

        if(player.getY() == 850 && mapNumber == 4){
            image = Toolkit.getDefaultToolkit().createImage("map3.png");
            player.setY(10);
            mapNumber = 3;
        }



        if(player.getY() == 0 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map5.png");
            player.setY(840);
            mapNumber = 5;
        }

        if(player.getY() == 850 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map4.png");
            player.setY(10);
            mapNumber = 4;
        }



        if((player.getY() == 400 && mapNumber == 3) && (player.getX() >= 100 && player.getX() <= 200)){
            image = Toolkit.getDefaultToolkit().createImage("house.png");
            player.setX(400);
            player.setY(840);
            mapNumber = 101;
            player.setImage(front3, left3, right3, back3);
        }

        if(player.getY() == 850 && mapNumber == 101){
            image = Toolkit.getDefaultToolkit().createImage("map3.png");
            player.setX(150);
            player.setY(410);
            mapNumber = 3;
            player.setImage(front, left, right, back);
        }

        repaint();  


    }


    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            player.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            player.keyPressed(e);
        }
    }
    }

then here is Menu class which has main method as well

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

public class Menu extends JFrame {


private JButton buttonToStartTheQuest, buttonToShowCredits, buttonToExit, buttonToShowTopScores, buttonToTurnMenu, buttonToExit1, buttonToExit2, buttonToTurnMenu2;
private JPanel startingPanel, creditsPanel, topScoresPanel, userNamePanel;
private JLabel creditsLabel, topScoresLabel;
private JLabel inputLabel,outputLabel;
private JTextField userName;
private ImageIcon image;
private JButton startTheGame;
private Board board;





public Menu() {

    buttonToStartTheQuest = new JButton("Start A New Quest");
    buttonToShowTopScores = new JButton("View Top Scores");
    buttonToShowCredits = new JButton("Credits");
    buttonToExit = new JButton("Exit");
    buttonToTurnMenu=new JButton("Turn Back To Main Menu");
    buttonToExit1 = new JButton("Exit");
    buttonToExit2 = new JButton("Exit");
    buttonToTurnMenu2=new JButton("Turn Back To Main Menu");
    startTheGame=new JButton("Start The Game");




    startingPanel = new JPanel();
    startingPanel.setPreferredSize(new Dimension(900,900));
    startingPanel.setLayout(new GridLayout(4,1));



    creditsPanel=new JPanel();
    creditsPanel.setPreferredSize(new Dimension(900,900));
    creditsLabel=new JLabel("Credits\nThis Game is Created By:\nPokeMan");
    creditsPanel.add(creditsLabel);

    image=new ImageIcon("bigKid.png");
    userName=new JTextField(20);
    userName.addActionListener(new UserListener());

    inputLabel= new JLabel("Enter Your User Name To Start The Quest",image, SwingConstants.CENTER);
    outputLabel=new JLabel("");

    userNamePanel=new JPanel();
    userNamePanel.setPreferredSize(new Dimension(900,900));
    userNamePanel.setBackground(Color.white);

    userNamePanel.add(inputLabel);
    userNamePanel.add(userName);
    userNamePanel.add(outputLabel);



    topScoresPanel=new JPanel();
    topScoresPanel.setPreferredSize(new Dimension(900,900));
    topScoresLabel=new JLabel("Top Score\n 1----\n2-----\n3------");
    topScoresPanel.add(topScoresLabel);



    ButtonListener listener = new ButtonListener();
    buttonToStartTheQuest.addActionListener(listener);
    buttonToShowTopScores.addActionListener(listener);
    buttonToShowCredits.addActionListener(listener);
    buttonToExit.addActionListener(listener);

    ButtonListener1 listener1= new ButtonListener1();
    buttonToExit1.addActionListener(listener1);
    buttonToTurnMenu.addActionListener(listener1);

    ButtonListener2 listener2 = new ButtonListener2();
    buttonToExit2.addActionListener(listener2);
    buttonToTurnMenu2.addActionListener(listener2);



    startingPanel.add(buttonToStartTheQuest);
    startingPanel.add(buttonToShowTopScores);
    startingPanel.add(buttonToShowCredits);
    startingPanel.add(buttonToExit);

    setTitle("Quest for Philosophy");  
    setSize(900, 900);
    setResizable(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().add(startingPanel);
    pack();
    setVisible(true);


    startTheGame.addActionListener(new GameStarter());




}


private class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){

        Object source = e.getSource();


        if(source == buttonToExit){
            System.exit(0);

        }

        if(source == buttonToShowCredits){

            remove(startingPanel);
            creditsPanel.add(buttonToExit1);
            creditsPanel.add(buttonToTurnMenu);
            add(creditsPanel);
            repaint();
            validate();
        }

        if(source == buttonToShowTopScores){
            remove(startingPanel);
            topScoresPanel.add(buttonToExit2);
            topScoresPanel.add(buttonToTurnMenu2);
            add(topScoresPanel);
            repaint();
            validate();

         }
         if(source==buttonToStartTheQuest){
            remove(startingPanel);
            add(userNamePanel);
            repaint();
            validate();
         }
    }       
}
private class ButtonListener1 implements ActionListener{
    public void actionPerformed(ActionEvent e1){
        Object source1= e1.getSource();
        if(source1==buttonToExit1)
            System.exit(0);
        else if(source1==buttonToTurnMenu){
            System.out.println("a");
            remove(creditsPanel);
            add(startingPanel);
            repaint();
            validate();
        }
    }
}

private class ButtonListener2 implements ActionListener{
    public void actionPerformed(ActionEvent e2){
        Object source2=e2.getSource();
        if(source2==buttonToExit2)
            System.exit(0);
        else if(source2==buttonToTurnMenu2){
            remove(topScoresPanel);
            add(startingPanel);
            repaint();
            validate();
            }           
    }
}
private class UserListener implements ActionListener{
    public void actionPerformed(ActionEvent event){
        String text=userName.getText();
        outputLabel.setText("Game Is Started with User Name: " + text);
        userNamePanel.add(startTheGame);
        repaint();
        validate();


    }
}
private class GameStarter implements ActionListener{
    public void actionPerformed(ActionEvent event){
        Object source=event.getSource();

        if(source==startTheGame){ //here is where problem occurs
            System.out.println("a");
            board= new Board();
            remove(userNamePanel);
            add(board);
            repaint();
            validate();


        }
    }
}




public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {

            Menu ex = new Menu();
        }
    });
} 
}

Thanks in advance.

Upvotes: 0

Views: 42

Answers (1)

dryairship
dryairship

Reputation: 6077

You can use JOptionPane.

eg:

JOptionPane.showOptionDialog(_parentComponent_,
             _message_, // Message String
             _title_,  // Title of the Dialog
             _optionType_, // 0, as you give the options
             _messageType_,  // type - information, question etc
             _icon_, // whatever icon you want
             _options_, // the options as an array of Objects
             _initialValue_ );// The selected value - index

This will create a dialog with buttons, wit the text from elements of o. It will return the index of the selected Item. For you, it could be:

Object o = {"Start", "Top Scores"....};
int selectedIndex = JOptionPane.showOptionDialog(null, "Choose an option", "Game", 0, -1, null,o, 0);

Upvotes: 1

Related Questions