【Java系列】(一)Java圖形化介面設計——中間容器(Jpanel)
Swing 程式用JFrame 物件實現了它們的視窗。JFrame 類是AWT Frame 類的一個子類。它還加入了一些Swing 所獨有的特性。與 Frame 的使用十分相似。唯一的區別在於,你不能將元件加入到JFrame中。你可以或者將元件加入到JFrame 的content pane(內容面板) 中,或者提供一個新的content pane(內容面板)。
面板與頂層容器的不同點:面板不能獨立存在,必須被新增到其他容器內部(面板可以巢狀)。
JFrame 有一個 Content Pane的視窗,能顯示的所有元件都是新增在這個
Content Pane 中。JFrame 提供了兩個方法: getContentPane 和 setContentPane 就是用於獲取和設定其 Content Pane 的。
對JFrame新增元件有兩種方式:
1)用 getContentPane ()方法獲得JFrame的內容面板,再對其加入元件:frame.getContentPane().add(childComponent)
2)建立一個Jpanel或JDesktopPane之類的中間容器,把元件新增到容器中,用setContentPane()方法把該容器置為JFrame的內容面板:
JPanel contentPane = new JPanel();
……//把其它元件新增到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane物件設定成為frame的內容面板
一般用第一中方法新增元件。
注意:用setContentPane()方法不允許設定窗體佈局,其只顯示最後新增的元件,且該元件將佈滿整個視窗,而不管原先元件的大小設定,相當於只允許新增一次元件作為JFrame的內容面板。所以一般不實用該方法進行新增元件(可能是我不知道吧)。
2、 JPanel的使用
JPanel是Java圖形化介面中最常使用的容器。
例項1:在窗體中新增一個藍色的面板
package frame;
import javax.swing.*;
import java.awt.*; //引入AWT包,因為要使用到顏色類
public class PanelDemo {
public static void main(String[] args) throws Exception {
JFrame f = new JFrame("第一個Java視窗");
f.setSize(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setLayout(null); //設定窗體佈局為空佈局
JPanel p = new JPanel(); //例項化一個面板
//設定面板顏色,如果不引入AWT包,程式將出錯
p.setBackground(Color.BLUE);
p.setSize(100,100); //設定面板物件大小
//用getContentPane()方法獲得JFrame的內容面板
f.getContentPane().add(p); //將面板加到窗體中
//如果使用下面面板新增方法,面板將佈滿整個視窗
//f.setContentPane(p);
}
}
中間容器可以巢狀中間容器
例項2:面板的巢狀
package frame;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TwoPanel extends JFrame {
public TwoPanel(String title) {
super(title);
}
public static void main(String[] args) {
TwoPanel tp = new TwoPanel("TWO Panel測試");
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
tp.setLayout(null);
tp.getContentPane().setBackground(Color.green); //設定視窗的顏色
tp.setSize(250, 250);
p1.setLayout(null); //設定面板佈局
p1.setSize(150, 150);
p1.setBackground(Color.red);
p2.setBackground(Color.yellow);
p2.setSize(50, 50);
p1.add(p2); //將面板p2新增到p1中
//將pan1新增到窗體中,因為pan2被新增到pan1中,所以pan1、pan2都被顯示在窗體中
tp.getContentPane().add(p1);
tp.setResizable(false);
tp.setVisible(true);
tp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
例項三:
package frame;
import java.awt.*;
import javax.swing.*;
public class JFrameWithPanel {
public static void main(String[] args) {
JFrame frame = new JFrame("Frame With Panel");
Container contentPane = frame.getContentPane();
contentPane.setBackground(Color.CYAN); // 將JFrame例項背景設定為藍綠色
JPanel panel = new JPanel(); // 建立一個JPanel的例項
panel.setBackground(Color.yellow); // 將JPanel的例項背景設定為黃色
JButton button = new JButton("Press me");
panel.add(button); // 將JButton例項新增到JPanel中
contentPane.add(panel, BorderLayout.SOUTH); // 將JPanel例項新增到JFrame的南側
frame.setSize(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}