2015-02-04 18 views
1

我嘗試在單獨的類中構建JPanel以單獨調用它們並在其上添加不同的項目。請你能告訴我我做錯了什麼嗎?從一個單獨的類(初學者)啓動JPanel

MyFrame.java

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

public class MyFrame extends JFrame { 

    public static void main(String[] args) { 

     MyFrame frame = new MyFrame(); 
     frame.setVisible(true); 

    } 

    public MyFrame() { 

     setTitle("MyFrame"); 
     setSize(300, 200); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     MyPanel panel = new MyPanel(); 

     JButton testButton = new JButton("Test"); 
     panel.add(testButton); 

    } 

} 

MyPanel.java

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

class MyPanel extends JPanel { 

    public MyPanel() { 

     this.setOpaque(true); 
     this.setVisible(true); 

    } 

} 

回答

5

你不加入你的面板變量,你的JFrame的contentPane中。

地址:

public MyFrame() { 
    setTitle("MyFrame"); 
    // setSize(300, 200); // let's avoid this 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    MyPanel panel = new MyPanel(); 

    JButton testButton = new JButton("Test"); 
    panel.add(testButton); 
    add(panel); // *** here 
    pack(); // this tells the layout managers to do their thing 
    setLocationRelativeTo(null); 
    setVisible(true); 
} 

補充說明:

public MyPanel() { 

    this.setOpaque(true); 
    this.setVisible(true); 

} 

JPanels是不透明的,默認情況下可見的,所以你的方法調用中的MyPanel構造函數什麼都不做有益的。注意事項2:我很少擴展JFrame或任何其他頂級窗口(除了JApplet,如果我被迫使用其中之一),因爲我很少改變窗口的固有行爲。更好的是,我想在需要時創建我的頂級窗口(即我的JFrame)。

備註3:始終努力在Swing事件線程上啓動Swing GUI。所以,做...

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      MyFrame frame = new MyFrame(); 
      frame.setVisible(true); 
     } 
    }); 
} 

編輯
你問:

你寫允許避免設置大小..你可以告訴我怎樣可以打包,但設置最小幀尺寸?

我喜歡重寫JPanel的getPreferredSize()方法,並讓它返回一個有意義的Dimension。

例如,你可以做這樣的事情,以確保您的GUI是免得PREF_W通過PREF_H大小:

import java.awt.Dimension; 

import javax.swing.*; 

public class ShowGetPreferredSize extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension superSize = super.getPreferredSize(); 
     if (isPreferredSizeSet()) { 
     return superSize; 
     } 
     int w = Math.max(superSize.width, PREF_W); 
     int h = Math.max(superSize.height, PREF_H); 
     return new Dimension(w, h); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("ShowGetPreferredSize"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(new ShowGetPreferredSize()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

謝謝。愚蠢的錯誤^^你寫的讓我們避免設置大小..你能告訴我如何我可以包裝它,但設置最小幀大小? – muni

+0

@muni:請看eidt。 –