jpanel作为内在阶级

时间:2013-02-08 19:38:03

标签: java swing

我需要写一个简单的网球比赛。 要在不同的窗口之间移动(带有主菜单的面板,带游戏的面板,带设置的面板)我决定使用内部类扩展JPanel并在发生start new game等事件时替换它。

但问题是 - 它没有看到我的内心阶级。我的意思是我将它添加到JFrame

mainframe.add(new MainMenuPanel());

但是我运行程序时屏幕上没有任何内容。有什么问题?

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);
    }
}
}

4 个答案:

答案 0 :(得分:3)

您在JPanel内创建了一个新的mainmenupanelMainMenuPanel,但从未将其添加到容器本身。你可以做到

add(mainmenupanel);

如果您希望此JPanel占据父级的完整区域,则只需将组件直接添加到MainMenuPanel的实例中,如@Mad所示

答案 1 :(得分:3)

mainmenupanel类中不需要MainMenuPanel,因为MainMenuPanel本身就是JPanel

简单地将MainMenuPanel中的所有组件直接添加到自身

答案 2 :(得分:1)

首先,您应该将组件添加到ContentPane。在Swing中,JFrame显示的所有非菜单组件都应该在ContentPane中。

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

编辑:我对内容窗格的看法不对,请参阅@MadProgrammer评论。

然后,您必须将您在MainMenuPanel中创建的JPanel添加到MainMenuPanel实例本身。

add(mainmenupanel);

但你应该摆脱那个中间容器本身并将你的标签添加到MainMenuPanel实例本身:

add(label1);
add(btnNewGame);

答案 3 :(得分:1)

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

试试这个:

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