2016-11-24 58 views
1

我需要menuPanel的組件在框架展開時展開。 MenuPanel使用的是GridBayLayout,我用面板的填充和重量值來修飾,但是沒有任何東西看起來會導致組件隨着框架調整大小。如何使用GridBagLayout強制JPanel使用JFrame進行調整

我懷疑我在顯示類中添加menuPanel的方式有問題。此外,我還嘗試將設置佈局設置爲TanksApplication,但這也不起作用。我想,我不瞭解一些基本的東西。

主要應用

public class TanksApplication extends JFrame{ 

     public TanksApplication(){ 
      super("Tanks"); 
     } 

     public static void main (String args[]){ 
      Display display = new Display(); 
      TanksApplication frame = new TanksApplication(); 
      frame.add(display); 
      frame.setSize(600,425); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLocationRelativeTo(null); 
     } 
    } 

Display類

public class Display extends JPanel{  
    public Display(){ 
     menuPanel = new JPanel(new GridBagLayout()); 
     GridBagConstraints con = new GridBagConstraints(); 

     mainMenuImageP = new JPanel(); 
     mainMenuImageP.setBackground(Color.BLACK); 
     con.fill = GridBagConstraints.BOTH; 
     con.gridy = 0; 
     con.gridx = 0; 
     con.gridwidth = 2; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 400; 
     con.ipady = 300; 
     con.insets = new Insets(0,20,0,20); 
     menuPanel.add(mainMenuImageP, con); 

     newGameB = new JButton("New Game"); 
     con.fill = GridBagConstraints.HORIZONTAL; 
     con.gridy = 1; 
     con.gridx = 0; 
     con.gridwidth = 1; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 0; 
     con.ipady = 0; 
     con.insets = new Insets(10,10,10,10); 
     menuPanel.add(newGameB, con); 

     loadGameB = new JButton("Load Game"); 
     con.fill = GridBagConstraints.HORIZONTAL; 
     con.gridy = 1; 
     con.gridx = 1; 
     con.gridwidth = 1; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 0; 
     con.ipady = 0; 
     con.insets = new Insets(10,10,10,10); 
     menuPanel.add(loadGameB, con); 

     add(menuPanel); 
    } 

回答

1

你的問題是,你正在使用menuPanel到顯示的JPanel添加你的GridBagLayout的,後者的使用JPanel的默認的FlowLayout。 FlowLayout不會調整添加到其中的組件的大小。解決方案:獲取menuPanel的rid,並使用Display JPanel。給它一個GridBagLayout並將組件添加到它。

所以有你的顯示器的構造函數中

setLayout(new GridBagLayout()); 

刪除JPanel menuPanel = new JPanel();以及任何你有menuPane.add(...);,將其更改爲簡單add(...);

例如,

public class Display extends JPanel{  
    public Display(){ 
     // !! menuPanel = new JPanel(new GridBagLayout()); 
     GridBagConstraints con = new GridBagConstraints(); 

     mainMenuImageP = new JPanel(); 
     mainMenuImageP.setBackground(Color.BLACK); 
     con.fill = GridBagConstraints.BOTH; 
     con.gridy = 0; 
     con.gridx = 0; 
     con.gridwidth = 2; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 400; 
     con.ipady = 300; 
     con.insets = new Insets(0,20,0,20); 
     // !! menuPanel.add(mainMenuImageP, con); 
     add(mainMenuImageP, con); // !! 

     newGameB = new JButton("New Game"); 
     con.fill = GridBagConstraints.HORIZONTAL; 
     con.gridy = 1; 
     con.gridx = 0; 
     con.gridwidth = 1; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 0; 
     con.ipady = 0; 
     con.insets = new Insets(10,10,10,10); 
     // !! menuPanel.add(newGameB, con); 
     add(newGameB, con); // !! 

     loadGameB = new JButton("Load Game"); 
     con.fill = GridBagConstraints.HORIZONTAL; 
     con.gridy = 1; 
     con.gridx = 1; 
     con.gridwidth = 1; 
     con.weightx = 0.5; 
     con.weighty = 0.5; 
     con.anchor = GridBagConstraints.CENTER; 
     con.ipadx = 0; 
     con.ipady = 0; 
     con.insets = new Insets(10,10,10,10); 
     // !! menuPanel.add(loadGameB, con); 
     add(loadGameB, con); // !! 

     // !! add(menuPanel); 
    } 

} 

注意,如果這樣沒有幫助,那麼請考慮創建和發佈一個minimal example programSSCCE

+0

這是一個好主意,謝謝。我會試一試。我沒有意識到Display是一個面板,我不知道爲什麼我沒有想到它。 – ulw1

+0

就是這樣。再次感謝。 – ulw1

+0

@ ulw1:不客氣。如果你絕對需要使用諸如menuPanel之類的內部JPanel,那麼你會希望讓你的DisplayPanel使用一個佈局來改變其組件preferredSizes,比如BorderLayout。 –

相關問題