2013-07-17 67 views
0

我基本上一直试图通过使用JFrame并切换出2个JPanel(一个用于菜单,另一个用于实际游戏)来制作游戏菜单。我试图实现我能想到的最基本的格式,但似乎无法使其工作。如果有人可以解释代码有什么问题,我将不胜感激。在单个JFrame中使用多个JPanel

这里是我的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;  
} 

} 

同样的面板,如果任何人都可以向我解释什么是错,此代码我将不胜感激。由于

回答

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的实例并将应用程序组件添加到它。这样,您的应用程序在部署和重用方面变得更加灵活

+0

感谢您的建议,我从来没有使用过重新验证,但它现在工作。此外,感谢您的链接,它看起来像卡布局是要走的路。 –

1

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

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

有什么错我的代码可能是一种模糊的问题,但我会一些积分排序:

  • extends JFrame:你不是真的延长JFrame,你”重新使用一个,作为GUI的一部分。
  • 正如其他答案所述,添加/删除组件后,您应该revalidate()
  • menu.setVisible(true),通常这是不需要的。
  • 也许不是错误,但我通常先建立我的所有界面(,创建并添加初始组件),然后才设置框架的尺寸和可见性。
  • 您正在运行main线程中的所有代码; Swing组件不是线程安全的。有关更多信息,请参阅Concurrency in Swing
  • 我知道这是一款游戏,但是绝对需要您的面板定位吗?如果可能的话,使用布局管理器(除了游戏面板的例外,这可能只会自定义绘画)。
+0

啊,对不起,我只是意识到我忘了指定我的代码在做什么。感谢您的建议,但现在正在工作。 –