你不加入你的面板變量,你的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();
}
});
}
}
謝謝。愚蠢的錯誤^^你寫的讓我們避免設置大小..你能告訴我如何我可以包裝它,但設置最小幀大小? – muni
@muni:請看eidt。 –