第二節 Java Swing中的基本容器:JFrame


第二節 基本容器: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中有五種常見的布局管理器:FlowLayoutBorderLayoutGridLayoutCardLayout,絕對定位。

 

 

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);

}

 

效果如下:

 

 

使用絕對定位有一點好處就是不管窗體如何改變大小,組件的位置是固定不變的,而之前的各種布局方式,當窗體大小改變時,組件大小也會改變。

 

 

 

 

 

 

 


免責聲明!

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



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