在单个JFrame中使用多个JPanel

时间:2013-07-17 23:13:05

标签: java swing jframe jpanel jbutton

我基本上一直试图通过使用JFrame并切换出2个JPanels(一个用于菜单,一个用于实际游戏)来制作游戏菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法让它工作。如果有人能解释代码有什么问题我会很感激。

这是我的JFrame,菜单面板和ActionListener

package buttonMenu;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Skeleton extends JFrame implements ActionListener{

JPanel menu;
JButton button;

public Skeleton(){

setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);

menu = new JPanel();
button = new JButton("button");

menu.setSize(400, 400);
menu.setBackground(Color.BLACK);
menu.setVisible(true);
menu.add(button);

button.setLocation(200, 200);
button.addActionListener(this);

add(menu, BorderLayout.CENTER);

}

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
}

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

actionPerformed调用在此类中创建的面板

package buttonMenu;
import java.awt.Color;
import javax.swing.JPanel;
public class Game{

public static JPanel Game(){
    JPanel panel = new JPanel();
    panel.setSize(400, 400);
    panel.setBackground(Color.WHITE);
    return panel;       
}

}

同样,如果有人能向我解释这段代码有什么问题我会很感激。感谢

3 个答案:

答案 0 :(得分:2)

添加/删除组件时,您需要revalidate父容器强制它自行转发......

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.revalidate();
}

更好的解决方案是使用类似CardLayout

的内容

请查看How to use CardLayout了解详情

ps-我应该补充一下。您应该避免直接从JFrame扩展,而是在基本组件上创建整个应用程序,例如JPanel。当您需要显示它时,创建一个JFrame实例并将应用程序组件添加到它。这样,您的应用程序在部署和重用方面变得更加灵活

答案 1 :(得分:1)

使用validate()方法查看更改。

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.validate();
}

答案 2 :(得分:1)

我的代码有什么问题可能是一个模糊的问题,但我会对某些问题进行排序:

  • extends JFrame:你并不是扩展 JFrame,你只是使用一个,作为GUI的一部分。
  • 如其他答案所述,添加/删除组件后应revalidate()
  • menu.setVisible(true),通常不需要这样做。
  • 可能不是错误的,但我通常首先构建我的所有界面(,创建和添加初始组件),然后才设置维度和可见性帧。
  • 您正在main主题中运行所有代码; Swing组件不是线程安全的。有关详细信息,请参阅Concurrency in Swing
  • 我知道这是一个游戏,但是你的面板真的需要绝对定位吗?尽可能使用布局管理器(游戏面板除外,它可能只进行自定义绘画)。