2013-02-08 64 views
0

我需要寫一個簡單的網球比賽。 在不同的窗口之間移動(面板與主菜單,面板與遊戲,面板與設置)我決定使用內部類擴展JPanel並將其替換爲start new game之類的事件時發生。jpanel as inner class

但問題是 - 它沒有看到我的內心階層。我的意思是我把它添加到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); 
    } 
} 
} 

回答

1

首先,您應該將組件添加到ContentPane中。在Swing中,JFrame顯示的所有非菜單組件都應位於ContentPane中。

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

編輯:我錯了有關內容窗格中,看到@MadProgrammer評論。

然後,您必須將您在MainMenuPanel中創建的JPanel添加到MainMenuPanel實例本身。

add(mainmenupanel); 

但是,你也許應該擺脫中介容器本身和你的標籤添加到MainMenuPanel實例本身:

add(label1); 
add(btnNewGame); 
+1

添加(和其他一些JFrame的方法)會自動重定向到內容窗格,您的下半部分答案實際上是正確的 – MadProgrammer 2013-02-08 19:50:06

+0

確實!在這種情況之前,我主要使用Swing。我認爲這個重定向已經在1.5中添加了,對吧? – 2013-02-08 19:55:17

+0

@cyrillie是的,類似的東西 – MadProgrammer 2013-02-08 19:56:42

1
mainmenupanel.add(label1); 
    mainmenupanel.add(btnNewGame); 

試試這個:

super.add(label1); 
    super.add(btnNewGame); 
3

創建一個新的JPanel,mainmenupanel,內部MainMenuPanel但neve再加上容器本身。你可以做

add(mainmenupanel); 

如果您打算爲這個JPanel佔據父的整個區域,那麼你可以簡單地直接添加組件到你的MainMenuPanel例如,通過@Mad

指示
3

沒有需要爲MainMenuPanel類作爲MainMenuPanel內mainmenupanelJPanel本身

簡單直接添加的所有成分MainMenuPanel本身