2016-03-25 183 views
1

我有一個框架,在這個框架內我有一個面板與框佈局,在這個面板內我有4個面板。在框佈局中設置組件的自定義位置

 mainFrame = new JFrame("Basket Game"); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     mainPanel.add(options); 
     mainPanel.add(pname); 
     mainPanel.add(info); 
     mainPanel.add(gamearea);  

    mainFrame.setContentPane(mainPanel); 
    mainFrame.pack(); 
    mainFrame.getContentPane().setBackground(Color.LIGHT_GRAY); 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(600,600); 

的形式如下:

form

第3面板是確定適合我。但對於最後一個面板(黑色),我想添加一些具有自定義座標的組件。但是,當我嘗試將其與自定義添加座標:

basket.setLocation(500, 500); 
gamearea.add(basket); 

是不言而喻的面板直接頂中心(座標並不影響它的位置)

second

當我設置gameareI小號佈局到null我看不到面板上的我的標籤。我想我應該爲它做點額外的事情。我怎樣才能做到這一點?

+0

您的主窗口只有600x600。通過標題欄,選項,播放器名稱和信息,y = 500可能低於窗格的底部。 – AJNeufeld

+0

您是否瞭解佈局管理器的工作原理?你瞭解佈局經理的責任嗎?你是否瞭解API重置與佈局管理器交互的人員?如果你不這樣做,那麼空的佈局不是你正在尋找的選擇。在幾乎所有情況下,當你認爲你想要一個空的佈局時,你可能不需要。在這些罕見的情況下,空佈局可能會有用,自定義佈局會導致更少的問題和返工 – MadProgrammer

回答

1

問題不在於您的佈局管理器(null),也沒有排除任何內容。問題只是500x500不在game area的範圍之內。

public class NullLayout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(NullLayout::new); 
    } 

    NullLayout() { 
     JFrame frame = new JFrame("Basket Game"); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 4; i++) { 
      JPanel strip = new JPanel(); 
      strip.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50)); 
      strip.setBorder(BorderFactory.createTitledBorder("Strip " + i)); 
      strip.add(new JLabel("Strip " + i)); 
      mainPanel.add(strip); 
     } 

     JPanel gamearea = new JPanel(); 
     gamearea.setLayout(null); 
     mainPanel.add(gamearea); 

     for (int i = 0; i < 5; i++) { 
      int x = i * 100, y = i * 100; 
      JPanel basket = new JPanel(); 
      basket.setSize(200, 50); 
      basket.setLocation(x, y); 
      basket.setBackground(Color.YELLOW); 
      basket.add(new JLabel("x = " + x + ", y = " + y)); 
      gamearea.add(basket); 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setSize(600, 600); 

     frame.setVisible(true); 
    } 
} 

Basket showing (0,0), to (300,300), but not (400,400)

注意,在Basket 400400沒有顯示;它會離開遊戲區域的底部。

0

使用空佈局幾乎總是錯誤的。您應該使用LayoutManager來幫助將組件放置在您想要的位置 - 如果用戶更改主框架的大小,該選項尤其有用。使用GridBag或Mig佈局。

如果您絕對堅持使用空佈局,請創建一個擴展JPanel的新GameArea類,覆蓋其paintComponent()方法並使用child.setBounds(...)設置子級的位置。請確保重寫的方法中的第一條語句是super.paintComponent(g);

+0

肯定允許使用'null'佈局。請參閱https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html – AJNeufeld

+0

此外,用戶無法更改窗口的大小,因爲調用了「mainFrame.setResizable(false);' 。 – AJNeufeld

+0

@AJNeufeld它可能是「允許的」,但它非常令人沮喪,任何時候你可能認爲你需要它,你可能不會。整個Swing API都是圍繞佈局API編寫的,放棄將大量責任推給開發人員,而大多數人還沒有準備好處理它。 – MadProgrammer

相關問題