javax.swing.JFrame中使用jpanel來布局


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=》(各種組件)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM