2017-04-13 66 views
0

我正在努力使用Swing中的FlowLayout管理器放置一些簡單的對象。JPanel佔用JFrame的整個空間

基本上我創建了一個小程序,我已經設置了框架的大小,然後創建了一些JLabels,然後創建了一個JPanel。

我已將JPanel的setSize設置爲300x300,並將其顏色更改爲紅色以便直觀地看到它。然而,它佔用了JFrame的整個空間,看起來setsize對它沒有影響。

我在做什麼錯?我試着用Google搜索它,並改變了代碼幾次,但沒有運氣。我甚至讀過,但顯然沒有正確理解,oracle上的代碼... 請幫忙。下面是我的代碼到目前爲止。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main extends JFrame{ 

    public String frameTitle, projectNameString, countryNameString, projectDetailString, requestDateString; 
    private int offerRevisionVal; 
    private Toolkit toolkit; 


    // UPPER OBJECTS 
    //private JLabel projectLabel, countryLabel, projectDetailLabel, offerLabel, requestDateLabel, emptyLabel; 


    public Main(){ 

     frameTitle = "CRANES QUOTATIONS"; 

     // MAIN INSTANCE VARIABLES DEFINITION 
     projectNameString = "Project Title"; // TO ADD LATER 
     countryNameString = "Brazil"; // TO ADD LATER 
     projectDetailString = "32 Cranes biTravi"; // TO ADD LATER 
     offerRevisionVal = 01; // TO ADD LATER 
     requestDateString = "20-April-2017"; // tTO ADD LATER 

     this.setTitle(frameTitle); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.red); 
     panel.setSize(new Dimension(300,300)); 


     //projectLabel = new JLabel(projectNameString); 
     //countryLabel = new JLabel(countryNameString); 
     //projectDetailLabel = new JLabel(projectDetailString); 
     //offerLabel = new JLabel(String.valueOf(offerRevisionVal)); 
     //requestDateLabel = new JLabel(requestDateString); 




     this.add(panel);    
     // =========================================================================== 
     this.setSize(800, 300); // set the height and width of my window 
     this.centerToScreen(); 
     this.setVisible(true); // set visibility 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); // sets up what it does when I close the App. 

    } 

    // Method to center to screen 
    public void centerToScreen(){ 

     toolkit = getToolkit(); 
     Dimension size = toolkit.getScreenSize(); // gets the screen size 
     setLocation(size.width/2 - getWidth()/2, size.height/2 - getHeight()/2); // sets the location 
    } 


    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 

      @Override 
      public void run() { 
       new Main(); 

      } 

     }); 


    } 
    } 
+0

我建議看一看[佈局管理器的視覺指南](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)和[敷設容器內的組件] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer

+0

這是我擡頭看的第一個地方。但是它並沒有提到帕夫洛所說的問題。當討厭的邏輯被複雜的錯誤覆蓋時,我討厭它......很難學習正確的道路。我會在今天晚上回來工作後試試,並希望它能奏效。 – zypa

+1

另一個地方是[JFrame的JavaDocs](https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html),其中指出*「默認內容窗格將有一個BorderLayout管理器設置它「* – MadProgrammer

回答

1

JFrame使用BorderLayout默認LayoutManager。所以,你需要含蓄地設置您的JFrameFlowLayout的佈局:

this.setLayout(new FlowLayout()); 

您還需要在您的panel使用setPreferredSize()代替setSize(),因爲setSize()沒有效果,如果你panelJFrame)已非空容器LayoutManager

+2

[我應該避免在Java Swing中使用set(Preferred | Maximum | Minimum)尺寸方法?](http://stackoverflow.com/questions/7229226/should-i -avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) – MadProgrammer

+0

是的,實際上這工作。我已經將FlowLayout設置爲JFrame,然後添加JPanel並使用PreferredSize設置大小。現在所有的工作。再次感謝 – zypa