第二節 基本容器:JFrame
如果要使用Swing創建一個窗口,則直接使用JFrame即可,此類事Component類的子類,常用方法如下:
小試牛刀 創建一個簡單的窗口
import java.awt.*;
import java.io.*;
import javax.swing.*;
public class JavaSwingTest {
public static void main(String args[]) throws IOException{
test1();
}
//創建一個新的窗體
public static void test1(){
JFrame f=new JFrame("第一個Swing窗口");//實例化窗體對象
f.setSize(230,80);//設置窗體大小
f.setBackground(Color.WHITE);//設置窗體的背景顏色
f.setLocation(1000,600);//設置窗體的顯示位置
f.setVisible(true);//讓組建顯示
}
效果:
以上最重要的是f.setVisible(true);如果沒有這一步,窗體就不會顯示。是不是有點小激動,其實這沒什么,后面還有很多。
在JFrame中也可以使用Dimension類設置窗體的大小,此類封裝的組件顯示高度和寬度,Dimension常用方法如下:
除了設置組件大小可以使用Dimension類,對於組件的顯示位置也存在一個Point類,此類封裝的是現實位置X,Y坐標。Point類常用的方法如下:
說明:所謂組件大小以及組件的顯示位置是這樣布局的
實例:
//使用Dimension和Point類設置組件大小和顯示位置
public static void test2(){
JFrame f=new JFrame("第一個Swing窗口");
Dimension d=new Dimension();//實例化Dimension對象
d.setSize(400,200);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
調用該方法運行后效果如下:
實例:
//使用Dimension和Point類設置組件大小和顯示位置
public static void test2(){
JFrame f=new JFrame("第一個Swing窗口");
Dimension d=new Dimension();//實例化Dimension對象
d.setSize(400,200);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
調用該方法運行后效果如下:
標簽組件:JLabel
JLabel組件表示的是一個標簽,本身是用於顯示信息的,創建完的Label對象可以通過Container類中的add方法加入到容器中,JLabel常用方法如下:
實例:
//使用一個標簽JLable
public static void test3(){
JFrame f=new JFrame("Welcome to 密訊");
Dimension d=new Dimension();//實例化Dimension對象
JLabel lab=new JLabel("MichaelLee",JLabel.CENTER);
f.add(lab);
d.setSize(400,200);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
運行后效果:
以上的標簽內容只是使用了默認的字體以及顏色,如果現在要更改字體則可以使用Component類中定義的方法:
Public void setFont();
Font類常用方法如下:
//更改JLabel的文字樣式,設置標簽的顯示字體,大小,背景顏色
public static void test4(){
JFrame f=new JFrame("Welcome to 密訊");
Dimension d=new Dimension();//實例化Dimension對象
JLabel lab=new JLabel("MichaelLee",JLabel.CENTER);
Font font=new Font("隸書",Font.ITALIC+Font.BOLD,28);
lab.setForeground(Color.RED);
lab.setFont(font);
f.add(lab);
d.setSize(400,200);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
運行效果如下
:
可以發現,標簽的字體類型以及顏色都發生了變化
如果不知道本機的字體樣式,可以使用一下方法得到本機的字體樣式:
//取得本機中全部可用的字體
public static void GetAllFonts(){
//取得本地的繪圖設備和字體集合
GraphicsEnvironment eq=GraphicsEnvironment.getLocalGraphicsEnvironment();
//取得全部可用字體
String []fontName=eq.getAvailableFontFamilyNames();
for(int i=0;i<fontName.length;i++){
if(i%10==0)
System.out.println("");
System.out.print(fontName[i]+"; ");
}
}
由於內容太多這里只截取部分:
如果我們想直接將一個圖像設置到JLabel中也是可以的,不過要使用Icon接口以及ImageIcon子類,ImageIcon類常用方法如下:
下面我們先使用InputStream類完成操作:
//在JLabel中設置圖片
public static void test5() throws IOException{
JFrame f=new JFrame("Welcome to MichaelLee!");
String picPath="E:"+File.separator+"李超圖片"+File.separator+"sunyanzi.jpg";
File file=new File(picPath);
InputStream inputStream=new FileInputStream(file);
Dimension d=new Dimension();//實例化Dimension對象
byte b[]=new byte[(int)file.length()];
inputStream.read(b);
inputStream.close();
Icon icon=new ImageIcon(b);
JLabel lab=new JLabel("MichaelLee",icon,JLabel.CENTER);
Font font=new Font("隸書",Font.ITALIC+Font.BOLD,28);
lab.setForeground(Color.RED);//設置標簽的文字顏色
lab.setBackground(Color.YELLOW);//設置標簽的背景顏色
lab.setFont(font);
f.add(lab);
d.setSize(800,400);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
效果如下:
從上例可以看出,使用一個IO流來完成操作很麻煩,那么可以直接將一個圖片的路徑傳遞到ImageIcon的實例化對象中,如下所示:
//另一種ImageIcon的用法
public static void test6(){
JFrame f=new JFrame("Welcome to MichaelLee!");
String picPath="E:"+File.separator+"李超圖片"+File.separator+"sunyanzi.jpg";
Icon icon=new ImageIcon(picPath,"我喜歡孫燕姿!");//實例化對象,直接加入路徑
JLabel lab=new JLabel("MichaelLee",icon,JLabel.CENTER);
Font font=new Font("隸書",Font.ITALIC+Font.BOLD,28);
lab.setForeground(Color.RED);//設置標簽的文字顏色
lab.setBackground(Color.YELLOW);//設置標簽的背景顏色
lab.setFont(font);
f.add(lab);
Dimension d=new Dimension();//實例化Dimension對象
d.setSize(800,400);
f.setSize(d);
f.setBackground(Color.WHITE);
Point p=new Point();//實例化Point對象
p.setLocation(300,200);
f.setLocation(p);
f.setVisible(true);
}
效果如下:
與上面的效果一樣,如果此時是一個不確定的輸入流(比如從數據庫中讀取BLOG字段)中而來,則要使用第一種方法,若是直接從文件中而來,那么就可以使用第二種方法。
按鈕組件:JButton
JButton組件是在窗體中添加一個按鈕,常用方法如下:
首先建立一個普通的按鈕:
//按鈕組件,建立一個普通的按鈕
public static void test7(){
JFrame jf=new JFrame("Welcome to MichaelLee!");
JButton jb=new JButton("按我");
jb.setBounds(100,100,200,200);
Font font=new Font("serif",Font.BOLD,28);
jb.setFont(font);
jf.add(jb);
jf.setSize(400,300);
jf.setLocation(400,400);
jf.setVisible(true);
}
效果如下:
JButton也可以為按鈕設置一張圖片:
//在按鈕上顯示圖片
public static void test8(){
JFrame jf=new JFrame("Welcome to MichaelLee!");
String picPath="E:"+File.separator+"李超圖片"+File.separator+"sunyanzi.jpg";
Icon icon=new ImageIcon(picPath,"我喜歡孫燕姿!");
JButton jb=new JButton(icon);
jb.setBounds(200,200,200,200);
Font font=new Font("serif",Font.BOLD,28);
jb.setFont(font);
jf.add(jb);
jf.setSize(800,600);
jf.setLocation(500,300);
jf.setVisible(true);
}
效果如下:
中間圖片是一個按鈕
布局管理器:
通過以上的洋里可以發現,如果不對窗體進行版面設置,則一個組建會直接充滿整個窗體,所以在Java中專門提供了布局管理器來管理組件,通過布局管理器可以使用不同的方式排列組件。
在Swing中有五種常見的布局管理器:FlowLayout,BorderLayout,GridLayout,CardLayout,絕對定位。
FlowLayout:
FlowLayout屬於流式布局管理器,使用此種布局會使所有的組件像流水一樣一次進行排列,FlowLayout常用方法及常量如下:
ut常用方法及常量如下:
設置FlowLayout
//設置流式布局管理器FlowLayout
public static void test9(){
JFrame jf=new JFrame("Welcome to MichaelLee!");
jf.setLayout(new FlowLayout(FlowLayout.CENTER,3,3));
jf.setLocation(500,300);
JButton jb=null;
for(int i=0;i<10;i++){
jb=new JButton("按鈕"+i);
jf.add(jb);
}
jf.setSize(400,400);
jf.setVisible(true);
}
運行效果:
BordLayout
BordLayout將一個窗體的版面划分成東西南北中五個區域,可以直接將需要的組件放到這五個區域中,BordLayout類的常用方法:
設置BordLayout
//設置BorderLayout
public static void test10(){
JFrame jframe=new JFrame("Welcome to MichaelLee!");
//設置窗體的布局管理器為BorderLayout,所有組件水平和垂直間距為3
jframe.setLayout(new BorderLayout(3,3));
jframe.add(new JButton("東(EAST)"),BorderLayout.EAST);
jframe.add(new JButton("西(WEST)"),BorderLayout.WEST);
jframe.add(new JButton("南(SOUTH)"),BorderLayout.SOUTH);
jframe.add(new JButton("北(NORTH)"),BorderLayout.NORTH);
jframe.add(new JButton("中(CENTER)"),BorderLayout.CENTER);
jframe.pack();//根據組件自動調整窗口大小
jframe.setVisible(true);
}
運行效果:
GridLayout
GridLayout布局管理器是以表格形式進行管理的,在使用此布局管理器時必須設置顯示的行數與列數,GridLayout常用的方法
Public GridLayout(int rows,int cols) //構造一個指定行和列的布局管理器
Public GridLayout(int rows,int cols,int hgap,int vgap)//構造是指定行和列,水平和垂直間距
設置GridLayout
//設置GridLayout布局管理器
public static void test11(){
JFrame jframe=new JFrame("Welcome to MichaelLee!");
jframe.setLayout(new GridLayout(3,5,3,3));//安3*5進行排列,水平和垂直間距為3
JButton jButton=null;
for(int i=0;i<13;i++){
jButton=new JButton("按鈕-"+i);
jframe.add(jButton);
}
jframe.pack();
jframe.setVisible(true);
}
運行效果:
CardLayout
CardLayout就是將一組組件彼此重疊的進行布局,就像一張卡片一樣,這樣每次只展現一個界面。CardLayout常用方法如下:
設置CardLayout
//設置CardLayout布局管理器
public static void test12(){
JFrame jframe=new JFrame("Welcome to MichaelLee!");
CardLayout card=new CardLayout();
jframe.setLayout(card);
jframe.add(new JLabel("標簽——A",JLabel.CENTER),"First");
jframe.add(new JLabel("標簽——B",JLabel.CENTER),"Second");
jframe.add(new JLabel("標簽——C",JLabel.CENTER),"Third");
jframe.add(new JLabel("標簽——D",JLabel.CENTER),"Fourth");
jframe.add(new JLabel("標簽——E",JLabel.CENTER),"Fifth");
jframe.pack();
jframe.setVisible(true);
card.show(jframe.getContentPane(),"Third");
for(int i=0;i<5;i++){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
card.next(jframe.getContentPane());
}
}
界面會一個個的顯示,且顯示順序如圖所示
絕對定位
如果不想在窗體中設置布局管理器,也可以通過設置絕對坐標來完成,Component中提供了setBounds方法,可以定位一個組建的坐標,此方法定義如下:
Public void setBounds(int x,int y,int width,int height);
使用絕對布局
//使用絕對定位排版
public static void test13(){
JFrame jframe=new JFrame("Welcome to MichaelLee!");
jframe.setLayout(null);
JLabel title=new JLabel("MichaelLee!");
JButton enter=new JButton("enter");
JButton help=new JButton("help");
title.setBounds(45,5,150,20);
enter.setBounds(10, 30,80,20);
help.setBounds(100,30,80,20);
jframe.setSize(300,400);
jframe.add(title);
jframe.add(enter);
jframe.add(help);
jframe.setVisible(true);
}
效果如下:
使用絕對定位有一點好處就是不管窗體如何改變大小,組件的位置是固定不變的,而之前的各種布局方式,當窗體大小改變時,組件大小也會改變。