javax.swing.JFrame中使用jpanel來布局
【本文摘自CSDN】
通俗的講jframe相當與桌子,而jpanel相當桌布,jbutton,jlabel等相當於杯子,碗筷等,杯子,碗筷雖然可以直接放到桌子上但不是很規范,應該放到桌布上才對。
以前我沒有用jpanel來布局。直接就是jframe.add(jlabel1);然后就是jlabel1.setbound();這種做法不妥,雖然窗口可以正常顯示,但是還是不規范,有事后會有點小問題,當組件更改的時候會有點問題,會有陰影(以前遇到過這種問題)。
正確的做法是
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)
示例代碼如下:
1: import java.awt.BorderLayout;
2: import java.awt.Color;
3: import java.awt.Container;
4: import javax.swing.JButton;
5: import javax.swing.JFrame;
6: import javax.swing.JPanel;
7: public class NewClass extends JFrame {
8: /** Creates a new instance of NewClass */
9: public NewClass() {
10: init();
11: }
12: public void init() {
13: // 實例化JPanel等一些組件
14: JPanel pan1 = new JPanel();
15: JButton jb1 = new JButton("one in pan1");
16: JButton jb2 = new JButton("two in pan1");
17: JButton jb3 = new JButton("one out panel");
18: JButton jb4 = new JButton("two out panel");
19: // setBound()坐標是相對於pan1而言的
20: jb1.setBounds(0, 0, 100, 30);
21: jb2.setBounds(0, 200, 100, 30);
22: // 得到容器為什么不需要實例化?可能是因為每個窗口都有這個對象
23: Container cont = getContentPane();
24: // 將pan1添加到容器中
25: cont.add(pan1, BorderLayout.CENTER);
26: cont.add(jb4, BorderLayout.WEST);
27: cont.add(jb3, BorderLayout.EAST);
28: // 將組件添加到pan1中,並對pan1做一些初始化
29: pan1.setLocation(70, 70);
30: pan1.setLayout(null);//注意此處的null
31: pan1.add(jb1);
32: pan1.add(jb2);
33: pan1.setBackground(Color.ORANGE);
34: this.setBounds(0, 0, 400, 400);
35: this.setVisible(true);
36: }
37: public static void main(String arg[]) {
38: NewClass test = new NewClass();
39: }
40: }
問題1:做窗口程序時候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=》(各種組件)