我需要写一个简单的网球比赛。
要在不同的窗口之间移动(带有主菜单的面板,带游戏的面板,带设置的面板)我决定使用内部类扩展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);
}
}
}
答案 0 :(得分:3)
您在JPanel
内创建了一个新的mainmenupanel
,MainMenuPanel
,但从未将其添加到容器本身。你可以做到
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);