2013-07-17 70 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

啊,對不起,我只是意識到我忘了指定我的代碼在做什麼。感謝您的建議,但現在正在工作。 –