lapots
lapots

Reputation: 13415

jpanel as inner class

I need to write a simple tennis game. To move between different windows(panel with main menu, panel with game, panel with settings) I decided to use inner classes extends JPanel and replace it when some events like start new game occurs.

but the problem is - it doesn't see my inner class. I mean I add it to JFrame

mainframe.add(new MainMenuPanel());

but there is nothing on the screen when I run program. What's the problem?

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

public class MainFrame{
JFrame mainframe;

public static void main(String[] args){
    new MainFrame();
}

public MainFrame() {
    mainframe = new JFrame();
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainframe.setSize(300, 400);
    mainframe.setTitle("X-Tennis v0.1");

    mainframe.add(new MainMenuPanel());

    mainframe.getContentPane().setLayout(new GridLayout());
    mainframe.getContentPane().setBackground(Color.WHITE);
    mainframe.setVisible(true); 
}

public class MainMenuPanel extends JPanel {

    JPanel mainmenupanel;
    JLabel label1;
    JButton btnNewGame,btnJoinGame;
    ImageIcon iconNewGame,iconJoinGame;

    public MainMenuPanel(){
        mainmenupanel = new JPanel();

        label1 = new JLabel("X-TENNIS");
        label1.setFont(new Font("Comic Sans MS",Font.ITALIC,20));
        label1.setForeground(Color.BLUE);

        btnNewGame = new JButton("New Game", iconNewGame);
        btnNewGame.setFocusPainted(false);
        btnNewGame.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent e){
                        JOptionPane.showMessageDialog(mainframe, "New game");
                        //delete current panel and add another to mainframe
                    }
                }
        );
        btnNewGame.setPreferredSize(new Dimension(140,30));     
        btnJoinGame = new JButton("Join game",iconJoinGame);    
        mainmenupanel.add(label1);
        mainmenupanel.add(btnNewGame);
    }
}
}

Upvotes: 0

Views: 1291

Answers (4)

Cyrille Ka
Cyrille Ka

Reputation: 15533

First you should add your component to the ContentPane. In Swing, all the non-menu components displayed by the JFrame should be in the ContentPane.

mainframe.getContentPane().add(new MainMenuPanel()); 

Edit: I was wrong about the content pane, see @MadProgrammer comment.

Then you have to add the JPanel that you create in MainMenuPanel to the MainMenuPanel instance itself.

add(mainmenupanel);

But you should probably get rid of that intermediary container itself and add your labels to the MainMenuPanel instance itself:

add(label1);
add(btnNewGame);

Upvotes: 1

Reimeus
Reimeus

Reputation: 159864

You create a new JPanel, mainmenupanel, inside MainMenuPanel but never add that to the container itself. You could do

add(mainmenupanel);

If you intend for this JPanel to occupy the full area of the parent, then you can simply add your components directly to your instance of MainMenuPanel as indicated by @Mad

Upvotes: 3

MadProgrammer
MadProgrammer

Reputation: 347334

There is no need for mainmenupanel within the MainMenuPanel class as MainMenuPanel is a JPanel itself

Simple add all the components in MainMenuPanel directly to itself

Upvotes: 3

mustaphahawi
mustaphahawi

Reputation: 297

    mainmenupanel.add(label1);
    mainmenupanel.add(btnNewGame);

try this :

    super.add(label1);
    super.add(btnNewGame);

Upvotes: 1

Related Questions