0

我需要编写一个简单的网球游戏。为了在不同的窗口之间移动(主菜单面板、游戏面板、设置面板),我决定使用内部类扩展 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

4 回答 4

3

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

add(mainmenupanel);

如果您打算让它JPanel占据父级的全部区域,那么您可以简单地将组件直接添加到您的实例中,MainMenuPanel如 @Mad 所示

于 2013-02-08T19:44:21.090 回答
3

mainmenupanel类内不需要,MainMenuPanel因为 MainMenuPanelJPanel本身就是一个

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

于 2013-02-08T19:47:37.990 回答
1

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

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

编辑:我对内容窗格有误,请参阅@MadProgrammer 评论。

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

add(mainmenupanel);

但是您可能应该摆脱该中间容器本身并将标签添加到 MainMenuPanel 实例本身:

add(label1);
add(btnNewGame);
于 2013-02-08T19:40:35.713 回答
1
    mainmenupanel.add(label1);
    mainmenupanel.add(btnNewGame);

试试这个 :

    super.add(label1);
    super.add(btnNewGame);
于 2013-02-08T19:43:48.443 回答