2015-10-13 61 views
3

我剛開始在java中學習gui。我現在可以在擴展JFrame的同時創建具有特定大小的窗口。然而,我來閱讀這裏的帖子,最好不要擴展JFrame。然後我試圖通過設置的JPanel,而不是大小來創建一個窗口,但的setSize似乎並沒有工作(我的代碼必須缺少的東西)如何設置窗口大小而不擴展JFrame?

這裏是我的代碼爲我的框架

import javax.swing.JFrame; 
public class MyFrame{ 
    private JFrame mainFrame; 
    private MyPanel mainPanel; 

    public MyFrame(){ 
     mainFrame = new JFrame(); 
     mainPanel = new MyPanel(50, 50); 

     mainFrame.add(mainPanel); 
     mainFrame.setVisible(true); 
    } 
} 

和這是我爲我的面板

import javax.swing.JPanel; 
public class MyPanel extends JPanel{ 
    public MyPanel(int i, int j){ 
     setSize(i, j); 
    } 
} 

我想在我的框架類中添加frame.pack()的代碼,因爲我以爲框架,沒有它的大小設置,太小待觀察面板-i是錯誤

我的代碼中缺少什麼?

回答

4

我的代碼中缺少什麼?

初學者的自定義組件(Panel)的首選大小。 @Override getPreferredSize()返回一個邏輯值。

然後pack()框架確保它是顯示面板和任何其他組件所需的最小尺寸。

所以,這樣的事情:

import javax.swing.*; 

public class Application { 

    private JFrame frame; 
    private CustomPanel panel; 

    public Application() { 
     frame = new JFrame(); 
     // next 2 lines, just a good idea 
     frame.setLocationByPlatform(true); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     // at 50x50, the title bar on Windows is wider! 
     panel = new CustomPanel(200, 200); 
     frame.add(panel); 
     // make the frame smallest it can be and still show components 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       new Application(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 

class CustomPanel extends JPanel { 

    public CustomPanel(int w, int h) { 
     setPreferredSize(new java.awt.Dimension(w, h)); 
    } 
} 
+1

注意兩個'Frame'和'Panel'針對給出的AWT包中的自定義組件混淆的名稱既具有(同名)的部件。請爲班級使用更多的原始名稱,甚至/尤其是在短片段中,以供他人查看。我通常使用'WhatTheAppDoesFrame'和'HowThisComponentGroupCanBeDescribedPanel'的策略.. –

+1

得到它謝謝! ***也編輯過名字 – user3921890

+1

很好,你很快就能得到它! :)另請參閱我的(主要是冗餘)編輯。 ;) –