通俗的講jframe至關與桌子,而jpanel至關桌布,jbutton,jlabel等至關於杯子,碗筷等,杯子,碗筷雖然能夠直接放到桌子上但不是很規範,應該放到桌布上纔對。
之前我沒有用jpanel來佈局。直接就是jframe.add(jlabel1);而後就是jlabel1.setbound();這種作法不妥,雖然窗口能夠正常顯示,可是仍是不規範,有過後會有點小問題,當組件更改的時候會有點問題,會有陰影(之前遇到過這種問題)。java
正確的作法是
1.使用Container content=this.getContentPane();獲得容器
2.實例化一個jpanel 例如JPanel panel1=new javax.swing.JPanel();
3.實例化組件好比JButton等
4.使用panel1.add()方法添加組件
5.定位好比說JButton1.setbound(0,0,23,34);注意這裏的座標是相對於其所在的容器panel1
6.使用例如content.add(panel,BorderLayout.CENTER);方法把「桌布」(panel1)放到「桌子」content上。(JFrame的默認佈局是BorderLayout)佈局
示例代碼以下:this
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class NewClass extends JFrame { public NewClass() { init(); } public void init() { // 實例化JPanel等一些組件 JPanel pan1 = new JPanel(); JButton jb1 = new JButton("one in pan1"); JButton jb2 = new JButton("two in pan1"); JButton jb3 = new JButton("one out panel"); JButton jb4 = new JButton("two out panel"); // setBound()座標是相對於pan1而言的 jb1.setBounds(0, 0, 100, 30); jb2.setBounds(0, 200, 100, 30); // 獲得容器爲何不須要實例化?多是由於每一個窗口都有這個對象 Container cont = getContentPane(); // 將pan1添加到容器中 cont.add(pan1, BorderLayout.CENTER); cont.add(jb4, BorderLayout.WEST); cont.add(jb3, BorderLayout.EAST); // 將組件添加到pan1中,並對pan1作一些初始化 pan1.setLocation(70, 70); pan1.setLayout(null);//注意此處的null pan1.add(jb1); pan1.add(jb2); pan1.setBackground(Color.ORANGE); this.setBounds(0, 0, 400, 400); this.setVisible(true); } public static void main(String arg[]) { NewClass test = new NewClass(); } }
問題1:作窗口程序時候code
Container cont=getContentPane();對象
cont.add(pan1,BorderLayout.CENTER);//如何定位pan1位置?如何把pan1放到指定的座標?
答:可使用pan1.setbound()方法,相應的要設置cont.setLayout(null); 注意JPanel的默認佈局是FlowLayout
若是沒有設置cont.setLayout(null);系統會使用默認的佈局管理器,那麼pan1.setbound()就不會起做用,好比說上例cont沒有設置佈局管理器爲空。
容器包含關係JFrame => Container => JPanel =>(各類組件)get