2017-03-02 28 views
3

新手在這裏。JButton顯示在父面板之外(?)

我試圖創建一個框架,其中有一個黑色的面板來創建一些動畫,以及一個UI面板來放置控制按鈕。但是當我創建JButton並將它們添加到UI面板時,它們看起來不在UI面板中。

我認爲這是因爲佈局,但我不能決定哪種佈局最適合我的情況。試過GridLayout,GridBoxLayout,BoxLayout ...他們都沒有看起來好,我很確定我失去了一些東西。

Oracle文檔非常豐富,但我不能說它對我有很大的幫助,無法理解佈局。

這裏是我的代碼: 我編輯了我的代碼,這要歸功於Berger的回答,但仍然有問題,所以我更新了代碼和截圖以便清楚。

沒關係,我忘了修理一些零件,伯傑的答案是perfeclty工作。謝謝!

import java.awt.*; 
import javax.swing.*; 

public class gui { 
public static void InitializeGUI(){ 
//DEFINE MAIN FRAME 
JFrame window = new JFrame("Simulator"); 
window.setSize(1000, 1000); 
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
window.setLocationRelativeTo(null); 
//DEFINE UNIVERSE PANEL 
JPanel universe = new JPanel(){ 
     /** 
    * 
    */ 
private static final long serialVersionUID = 1L; 

@Override 
    public Dimension getPreferredSize() { 
    return new Dimension(window.getContentPane().getSize().width, 3 *  window.getSize().height/4); 
} 
}; 
universe.setBackground(Color.BLACK); 
//DEFINE UI PANEL 
JPanel ui = new JPanel() { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(window.getContentPane().getSize().width, window.getSize().height/4); 
    } 
}; 
//DEFINE BUTTONS 
JButton femalespawnbutton = new JButton("Spawn Female"); 
femalespawnbutton.setSize(150, 100); 
JButton malespawnbutton = new JButton("Spawn Male"); 
malespawnbutton.setSize(150, 100); 

//FILL 
ui.add(femalespawnbutton, BorderLayout.CENTER); 
ui.add(malespawnbutton, BorderLayout.CENTER); 
window.add(universe, BorderLayout.NORTH); 
window.add(ui, BorderLayout.SOUTH); 
window.setVisible(true); 
} 
} 

Here's the screenshot

回答

1

第一件事是雙方面板添加到window,其內容窗格中有一個BorderLayout

所以

window.add(universe); 
window.add(ui; 

相同

window.add(universe, BorderLayout.CENTER); 
window.add(ui, BorderLayout.CENTER); 

和兩種成分被添加到同一個地方(按鈕可能是隱藏的)

爲了避免這種情況,你可以給約束條件指示您想要添加組件的BorderLayout的位置,例如:

window.add(universe, BorderLayout.CENTER); 
window.add(ui, BorderLayout.SOUTH); 

第二件事是您使用setSize(),除非沒有佈局管理器,否則不會考慮這一點。

您可以使用setPreferredSize代替,其height價值將一些佈局管理器兌現,像BorderLayoutSOUTHNORTH組件。:

ui.setPreferredSize(new Dimension(1000, 250)); 

現在,如果你想讓它適應窗口的大小,重寫,而不是方法:

JPanel ui = new JPanel() { 

      @Override 
      public Dimension getPreferredSize() { 

       return new Dimension(window.getContentPane().getSize().width, window.getContentPane().getSize().height/4); 

      } 
     }; 

全部放在一起(如南方組件的首選高度很榮幸,沒有必要你的情況給一箇中心組件,它會採取的剩餘空間):

//DEFINE MAIN FRAME 
    final JFrame window = new JFrame("Simulator"); 
    window.setSize(1000, 1000); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setLocationRelativeTo(null); 

    //DEFINE UNIVERSE PANEL 
    JPanel universe = new JPanel(); 
    universe.setBackground(Color.BLACK); 

    //DEFINE UI PANEL 
    JPanel ui = new JPanel() { 

     @Override 
     public Dimension getPreferredSize() { 

      return new Dimension(window.getContentPane().getSize().width, window.getContentPane().getSize().height/4); 

     } 
    }; 

    //DEFINE BUTTONS 
    JButton femalespawnbutton = new JButton("Spawn Female"); 
    femalespawnbutton.setSize(250, 100); 
    JButton malespawnbutton = new JButton("Spawn Male"); 
    malespawnbutton.setSize(250, 100); 

    //FILL 
    ui.add(femalespawnbutton); 
    ui.add(malespawnbutton); 
    window.add(universe, BorderLayout.CENTER); 
    window.add(ui, BorderLayout.SOUTH); 
    window.setVisible(true); 

最後一個重要的注意事項:

儘管這種方法在某些情況下工作,應當鼓勵自己設置組件的尺寸(除頂層容器如Windows):

參見:Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

+0

感謝您的回覆,這真的很有幫助,我想明白爲什麼我應該避免給對象提供確切的措施。 即使我想通過重寫prefferedSize方法成功地將我的** **和** ui **面板放在正確的方法中,我仍然有問題。 我的按鈕仍然不在UI面板上,其中一個按鈕是隱藏的,直到我將鼠標移到它上面。 隨着你的回答,我明白,按鈕並不是實際上不在面板之外,它只是我的**宇宙**面板位於** ui **面板之上並覆蓋了它的一部分。但是,如何?以爲我固定面板尺寸? –

+0

下面是截圖: http://prnt.sc/ef4zsk http://prnt.sc/ef4zwl 和我的代碼的更新版本: http://prnt.sc/ef515q –

+0

確實很好,看起來窗口的高度考慮了標題欄,您可以使用'window.getContentPane()。getSize()'代替,我將編輯答案。 – Berger

0

我很抱歉 - 目前我沒有太多的時間 - 但現在:它與LayoutManager的一個問題。初始化JPanel時應該設置一個。例如新的Jpanel(新的GridLayout(1,2)); - >將工作,但不是很好;)的更多信息瞭解版式:

https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

+0

的問題是,無論是我使用ui面板(GridLayour或GridBag)時,按鈕總是假裝像UI面板的尺寸是(1000,1000),而不是(1000,250),所以它們超出了ui面板的範圍。 感謝回覆,anwyay,正如我所說,很難理解,但我正在研究oracle教程。 –