您的位置:首页 > 编程语言 > Java开发

Java图形界面设计

2013-12-28 21:14 232 查看

一、总述

Java的图形用户界面由各种组件(component)构成,它们主要位于java.awt包与javax.swing包中。Swing与AWT最大的不同是,Swing在实现时,不包含任何本地代码(native),是一种“轻量级(lightweight)”的组件

Swing具有状态的组件。

二、容器

1.顶层容器:

JFrame、JApplet、JDialog 和 JWindow

2.JFrame创建的一个程序

2.1代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass JFrameDemo{

publicstaticvoid main(String args[]){

JFrame frame = new JFrame("JFrameDemo");

JButton button = new JButton("Press Me");

//first way to do that

// frame.getContentPane().add(button,BorderLayout.CENTER);

//another way to set the Pane

JPanel contentPane = new JPanel();

contentPane.setLayout(new BorderLayout());

contentPane.add(button,BorderLayout.CENTER);

frame.setContentPane(contentPane);

//frame.pack();

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class JFrameDemo{
public static void main(String args[]){
JFrame frame = new JFrame("JFrameDemo");
JButton button = new JButton("Press Me");

//first way to do that
// frame.getContentPane().add(button,BorderLayout.CENTER);

//another way to set the Pane
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
contentPane.add(button,BorderLayout.CENTER);
frame.setContentPane(contentPane);

//frame.pack();
frame.setVisible(true);
}
}

2.2执行结果



3.面板(JPanel)

可以相互嵌套,不能独立存在,只能添加到其他窗口内部。

3.1代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass FrameWithPanel{

publicstaticvoid main(String args[]){

JFrame frame = new JFrame("Frame with Panel");

Container contentPane = frame.getContentPane();

contentPane.setBackground(Color.CYAN);

JPanel panel = new JPanel();

panel.setBackground(Color.yellow);

JButton button = new JButton("Press me");

panel.add(button);

//add JButton instance to JPanel

//add JPanel instance to JFrame's south

contentPane.add(panel,BorderLayout.SOUTH);

frame.setSize(300,200);

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class FrameWithPanel{
public static void main(String args[]){
JFrame frame = new JFrame("Frame with Panel");
Container contentPane = frame.getContentPane();
contentPane.setBackground(Color.CYAN);

JPanel panel = new JPanel();
panel.setBackground(Color.yellow);

JButton button = new JButton("Press me");
panel.add(button);
//add JButton instance to JPanel

//add JPanel instance to JFrame's south
contentPane.add(panel,BorderLayout.SOUTH);
frame.setSize(300,200);
frame.setVisible(true);
}
}

3.2执行结果



三、布局

1.总述

组件的布局(包括位置与大小)通常由Layout Manager负责安排。Java平台提供了多种布局管理器,以下对其部分,进行说明。

2.FlowLayout Layout Manager

2.1FlowLayout 的三种构造方法

[java] view plaincopyprint?

public FlowLayout()

public FlowLayout(int align)

public FlowLayout(int align,int hgap,int vgap)

public FlowLayout()
public FlowLayout(int align)
public FlowLayout(int align,int hgap,int vgap)


构造方法中,提供了一个对齐方式的可选项align,取值有三种形式:FlowLayout.LEFT、 FlowLayout.CENTER 、FlowLayout.RIGHT。hgap和vgap可以设定组件的水平间距和垂直距离。

2.2参考代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass FlowLayoutDemo{

private JFrame frame;

private JButton btn1,btn2,btn3;

publicstaticvoid main(String args[]){

FlowLayoutDemo that = new FlowLayoutDemo();

that.go();

}

publicvoid go(){

frame = new JFrame("Flow Layout");

Container contentPane = frame.getContentPane();

contentPane.setLayout(new FlowLayout());

btn1 = new JButton("OK");

btn2 = new JButton("Open");

btn3 = new JButton("Close");

contentPane.add(btn1);

contentPane.add(btn2);

contentPane.add(btn3);

frame.setSize(300,200);

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class FlowLayoutDemo{
private JFrame frame;
private JButton btn1,btn2,btn3;

public static void main(String args[]){
FlowLayoutDemo that = new FlowLayoutDemo();
that.go();
}
public void go(){
frame = new JFrame("Flow Layout");
Container contentPane = frame.getContentPane();

contentPane.setLayout(new FlowLayout());

btn1 = new JButton("OK");
btn2 = new JButton("Open");
btn3 = new JButton("Close");

contentPane.add(btn1);
contentPane.add(btn2);
contentPane.add(btn3);

frame.setSize(300,200);
frame.setVisible(true);
}
}

2.3执行结果

改变Frame的大小,Frame中组件的布局也会随之改变。







3.BorderLayout 布局管理器

3.1概述

BorderLayout是顶层窗口中内容窗格的默认布局管理器,被划分为BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.CENTER 五个区域。

3.2构造函数

[java] view plaincopyprint?

BorderLayout()

BorderLayout(int,int)

BorderLayout()
BorderLayout(int,int)

3.3示例代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass BorderLayoutDemo{

private JFrame frame;

private JButton be,bw,bn,bs,bc;

publicstaticvoid main(String args[]){

BorderLayoutDemo that = new BorderLayoutDemo();

that.go();

}

publicvoid go(){

frame = new JFrame("Border Layout");

be = new JButton("East");

bw = new JButton("West");

bn = new JButton("North");

bs = new JButton("South");

bc = new JButton("Center");

frame.getContentPane().add(be,"East");

frame.getContentPane().add(bw,BorderLayout.WEST);

frame.getContentPane().add(bn,BorderLayout.NORTH);

frame.getContentPane().add(bs,BorderLayout.SOUTH);

frame.getContentPane().add(bc,BorderLayout.CENTER);

frame.setSize(350,200);

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class BorderLayoutDemo{
private JFrame frame;
private JButton be,bw,bn,bs,bc;

public static void main(String args[]){
BorderLayoutDemo that = new BorderLayoutDemo();
that.go();
}
public void go(){
frame = new JFrame("Border Layout");
be = new JButton("East");
bw = new JButton("West");
bn = new JButton("North");
bs = new JButton("South");
bc = new JButton("Center");

frame.getContentPane().add(be,"East");
frame.getContentPane().add(bw,BorderLayout.WEST);
frame.getContentPane().add(bn,BorderLayout.NORTH);
frame.getContentPane().add(bs,BorderLayout.SOUTH);
frame.getContentPane().add(bc,BorderLayout.CENTER);

frame.setSize(350,200);
frame.setVisible(true);
}
}


3.4执行结果



4.GridLayout布局管理器

4.1总述

是一种网格式的布局管理器,将窗口空间分割成若干行,乘若干列的网格。组件依次放入,占一格。

4.2构造函数

public GridLayout()

public GridLayout(int rows, int cols)

public GridLayout(int rows, int cols, int hgap, int vgap)

4.3参考代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass GridLayoutDemo{

private JFrame frame;

private JButton b1,b2,b3,b4,b5,b6;

publicstaticvoid main(String args[]){

GridLayoutDemo that = new GridLayoutDemo();

that.go();

}

publicvoid go(){

frame = new JFrame("Grid Frame");

Container contentPane = frame.getContentPane();

contentPane.setLayout(new GridLayout(3,2));

b1 = new JButton("grid_1");

b2 = new JButton("grid_2");

b3 = new JButton("grid_3");

b4 = new JButton("grid_4");

b5 = new JButton("grid_5");

b6 = new JButton("grid_6");

contentPane.add(b1);

contentPane.add(b2);

contentPane.add(b3);

contentPane.add(b4);

contentPane.add(b5);

contentPane.add(b6);

frame.pack();

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class GridLayoutDemo{
private JFrame frame;
private JButton b1,b2,b3,b4,b5,b6;

public static void main(String args[]){
GridLayoutDemo that = new GridLayoutDemo();
that.go();
}
public void go(){
frame = new JFrame("Grid Frame");

Container contentPane = frame.getContentPane();

contentPane.setLayout(new GridLayout(3,2));

b1 = new JButton("grid_1");
b2 = new JButton("grid_2");
b3 = new JButton("grid_3");
b4 = new JButton("grid_4");
b5 = new JButton("grid_5");
b6 = new JButton("grid_6");

contentPane.add(b1);
contentPane.add(b2);
contentPane.add(b3);
contentPane.add(b4);
contentPane.add(b5);
contentPane.add(b6);

frame.pack();
frame.setVisible(true);
}
}


4.4执行结果



5.CardLayout 布局管理器

5.1总述

是一种卡片式的布局管理器,它将容器中的组件处理成一系列卡片,每一时刻只显示出其中一张。

5.2参考代码:

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

publicclass CardLayoutDemo extends MouseAdapter{

JPanel p1,p2,p3,p4,p5;

JLabel l1, l2, l3, l4, l5;

//declare a Cardlayout object

CardLayout myCard;

JFrame frame;

Container contentPane;

publicstaticvoid main(String args[]){

CardLayoutDemo that = new CardLayoutDemo();

that.go();

System.out.println("test");

}

publicvoid go(){

frame = new JFrame("Card Test");

contentPane = frame.getContentPane();

myCard = new CardLayout();

contentPane.setLayout(myCard);

p1=new JPanel();

p2 = new JPanel();

p3 = new JPanel();

p4 = new JPanel();

p5 = new JPanel();

//set the different bk color for each JPanel label

l1 = new JLabel("This is the first JPanel");

p1.add(l1);

p1.setBackground(Color.yellow);

l2 = new JLabel("This is the second JPanel");

p2.add(l2);

p2.setBackground(Color.green);

l3 = new JLabel("This is the third JPanel");

p3.add(l3);

p3.setBackground(Color.magenta);

l4 = new JLabel("This is the forth JPanel");

p4.add(l4);

p4.setBackground(Color.white);

l5 = new JLabel("This is the fifth JPanel");

p5.add(l5);

p5.setBackground(Color.cyan);

//set mouseListener

p1.addMouseListener(this);

p2.addMouseListener(this);

p3.addMouseListener(this);

p4.addMouseListener(this);

p5.addMouseListener(this);

//set each JPanle as a Card to insert frame

contentPane.add(p1,"First");

contentPane.add(p2,"Sencond");

contentPane.add(p3,"Third");

contentPane.add(p4,"Forth");

contentPane.add(p5,"Fifth");

//display the first pic

myCard.show(contentPane,"First");

frame.setSize(300,200);

frame.show();

}

publicvoid mouseClicked(MouseEvent e){

myCard.next(contentPane);

}

}

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class CardLayoutDemo extends MouseAdapter{
JPanel p1,p2,p3,p4,p5;
JLabel l1, l2, l3, l4, l5;

//declare a Cardlayout object
CardLayout myCard;
JFrame frame;
Container contentPane;

public static void main(String args[]){
CardLayoutDemo that = new CardLayoutDemo();
that.go();
System.out.println("test");
}

public void go(){
frame = new JFrame("Card Test");
contentPane = frame.getContentPane();
myCard = new CardLayout();

contentPane.setLayout(myCard);

p1=new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel();

//set the different bk color for each JPanel label
l1 =  new JLabel("This is the first JPanel");
p1.add(l1);
p1.setBackground(Color.yellow);

l2 =  new JLabel("This is the second JPanel");
p2.add(l2);
p2.setBackground(Color.green);

l3 =  new JLabel("This is the third JPanel");
p3.add(l3);
p3.setBackground(Color.magenta);

l4 =  new JLabel("This is the forth JPanel");
p4.add(l4);
p4.setBackground(Color.white);

l5 =  new JLabel("This is the fifth JPanel");
p5.add(l5);
p5.setBackground(Color.cyan);

//set mouseListener
p1.addMouseListener(this);
p2.addMouseListener(this);
p3.addMouseListener(this);
p4.addMouseListener(this);
p5.addMouseListener(this);

//set each JPanle as a Card to insert frame
contentPane.add(p1,"First");
contentPane.add(p2,"Sencond");
contentPane.add(p3,"Third");
contentPane.add(p4,"Forth");
contentPane.add(p5,"Fifth");

//display the first pic
myCard.show(contentPane,"First");
frame.setSize(300,200);
frame.show();
}

public void mouseClicked(MouseEvent e){
myCard.next(contentPane);
}
}


5.2执行结果



6.BoxLayout布局管理器

6.1总述

将容器中的组件,按水平排成一行,或按垂直方向排成一列。

6.2构造函数

BoxLayout(Container target, int axis)

axis = BoxLayout.X_AXIS | BoxLayout.Y_AXIS

6.3参考代码

import java.awt.*;

import javax.swing.*;

public class BoxLayoutDemo{

private JFrame frame;

private JPanel pv,ph;

public static void main(String args[]){

BoxLayoutDemo that = new BoxLayoutDemo();

that.go();

}

public void go(){

frame = new JFrame("Box Layout example");

Container contentPane = frame.getContentPane();

pv = new JPanel();

pv.setLayout(new BoxLayout(pv,BoxLayout.Y_AXIS));

pv.add(new JLabel("Monday"));

pv.add(new JLabel("Tuesday"));

pv.add(new JLabel("Wednesday"));

pv.add(new JLabel("Thursday"));

pv.add(new JLabel("Friday"));

pv.add(new JLabel("Saturday"));

pv.add(new JLabel("Sunday"));

contentPane.add(pv,BorderLayout.CENTER);

ph = new JPanel();

ph.setLayout(new BoxLayout(ph,BoxLayout.X_AXIS));

ph.add(new JButton("Yes"));

ph.add(new JButton("No"));

ph.add(new JButton("Cancle"));

contentPane.add(ph,BorderLayout.SOUTH);

frame.pack();

frame.setVisible(true);

}

}

6.4执行结果



6.5专门使用BoxLayout的特殊容器—Box类

6.5.1创建实例的静态方法

[java] view plaincopyprint?

publicstatic Box createHorizontalBox()

publicstatic Box createVerticalBox()

public static Box createHorizontalBox()
public static Box createVerticalBox()

6.5.2|6.3的代码,改写如下

[java] view plaincopyprint?

//the specific Box class for BoxLayout Container

import java.awt.*;

import javax.swing.*;

publicclass BoxDemo{

private JFrame frame;

private Box bv,bh;

publicstaticvoid main(String arg[]){

BoxDemo that = new BoxDemo();

that.go();

}

void go(){

frame = new JFrame("Box Layout example");

Container contentPane = frame.getContentPane();

bv = Box.createVerticalBox();

bv.add(new JLabel("Monday"));

bv.add(new JLabel("Tuesday"));

bv.add(new JLabel("Wednesday"));

bv.add(new JLabel("Thursday"));

bv.add(new JLabel("Friday"));

bv.add(new JLabel("Saturday"));

bv.add(new JLabel("Sunday"));

contentPane.add(bv,BorderLayout.CENTER);

bh = Box.createHorizontalBox();

bh.add(new JButton("Yes"));

bh.add(new JButton("No"));

bh.add(new JButton("Cancel"));

contentPane.add(bh,BorderLayout.SOUTH);

frame.setSize(300,200);

//frame.pack();

frame.setVisible(true);

}

}

//the specific Box class for BoxLayout Container
import java.awt.*;
import javax.swing.*;

public class BoxDemo{
private JFrame frame;
private Box bv,bh;

public static void main(String arg[]){
BoxDemo that = new BoxDemo();
that.go();
}
void go(){
frame = new JFrame("Box Layout example");
Container contentPane = frame.getContentPane();

bv = Box.createVerticalBox();

bv.add(new JLabel("Monday"));
bv.add(new JLabel("Tuesday"));
bv.add(new JLabel("Wednesday"));
bv.add(new JLabel("Thursday"));
bv.add(new JLabel("Friday"));
bv.add(new JLabel("Saturday"));
bv.add(new JLabel("Sunday"));

contentPane.add(bv,BorderLayout.CENTER);

bh = Box.createHorizontalBox();
bh.add(new JButton("Yes"));
bh.add(new JButton("No"));
bh.add(new JButton("Cancel"));

contentPane.add(bh,BorderLayout.SOUTH);

frame.setSize(300,200);
//frame.pack();
frame.setVisible(true);
}
}


6.6Box类提供的创建不可组件方法

[java] view plaincopyprint?

publicstatic Component createHorizontalGlue()

publicstatic Component createHorizontalStrut(int width)

publicstatic Component createVerticalGlue()

publicstatic Component createVerticalStrut(int height)

publicstatic Component createRigidArea(Dimension d)

public static Component createHorizontalGlue()
public static Component createHorizontalStrut(int width)
public static Component createVerticalGlue()
public static Component createVerticalStrut(int height)
public static Component createRigidArea(Dimension d)

6.6.1参考代码

[java] view plaincopyprint?

//to create invisible component

import java.awt.*;

import javax.swing.*;

publicclass GlueAndStrut{

private JFrame frame;

private Box b1,b2,b3,b4;

publicstaticvoid main(String args[]){

GlueAndStrut that = new GlueAndStrut();

that.go();

}

void go(){

frame = new JFrame("Glue And Strut");

Container contentPane = frame.getContentPane();

contentPane.setLayout(new GridLayout(4,1));

b1 = Box.createHorizontalBox();

b1.add(new JLabel("Box 1:"));

b1.add(new JButton("Yes"));

b1.add(new JButton("No"));

b1.add(new JButton("Cancel"));

b2 = Box.createHorizontalBox();

b2.add(new JLabel("Box 2:"));

b2.add(new JButton("Yes"));

b2.add(new JButton("No"));

b2.add(Box.createHorizontalGlue());

b2.add(new JButton("Cancel"));

b3 = Box.createHorizontalBox();

b3.add(new JLabel("Box 3:"));

b3.add(new JButton("Yes"));

b3.add(new JButton("No"));

b3.add(Box.createHorizontalStrut(20));

b3.add(new JButton("Cancel"));

b4 = Box.createHorizontalBox();

b4.add(new JLabel("Box 4:"));

b4.add(new JButton("Yes"));

b4.add(new JButton("No"));

b4.add(Box.createRigidArea(new Dimension(10,10)));

b4.add(new JButton("Cancel"));

contentPane.add(b1);

contentPane.add(b2);

contentPane.add(b3);

contentPane.add(b4);

frame.setSize(300,200);

frame.setVisible(true);

}

}

//to create invisible component
import java.awt.*;
import javax.swing.*;

public class GlueAndStrut{
private JFrame frame;
private Box b1,b2,b3,b4;

public static void main(String args[]){
GlueAndStrut that = new GlueAndStrut();
that.go();
}
void go(){
frame = new JFrame("Glue And Strut");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(4,1));

b1 = Box.createHorizontalBox();
b1.add(new JLabel("Box 1:"));
b1.add(new JButton("Yes"));
b1.add(new JButton("No"));
b1.add(new JButton("Cancel"));

b2 = Box.createHorizontalBox();
b2.add(new JLabel("Box 2:"));
b2.add(new JButton("Yes"));
b2.add(new JButton("No"));
b2.add(Box.createHorizontalGlue());
b2.add(new JButton("Cancel"));

b3 = Box.createHorizontalBox();
b3.add(new JLabel("Box 3:"));
b3.add(new JButton("Yes"));
b3.add(new JButton("No"));
b3.add(Box.createHorizontalStrut(20));
b3.add(new JButton("Cancel"));

b4 = Box.createHorizontalBox();
b4.add(new JLabel("Box 4:"));
b4.add(new JButton("Yes"));
b4.add(new JButton("No"));
b4.add(Box.createRigidArea(new Dimension(10,10)));
b4.add(new JButton("Cancel"));

contentPane.add(b1);
contentPane.add(b2);
contentPane.add(b3);
contentPane.add(b4);

frame.setSize(300,200);
frame.setVisible(true);
}
}


6.6.2执行结果





7.不使用布局管理器

7.1一般做法

a.setLayout(null)将布局管理器设置为空

b.setBounds(int x,int y,int width,int height)设置组件的位置与大小

7.2参考代码

[java] view plaincopyprint?

import java.awt.*;

import javax.swing.*;

publicclass NullLayoutDemo{

private JFrame frame;

private JButton b1,b2,b3;

publicstaticvoid main(String args[]){

NullLayoutDemo that = new NullLayoutDemo();

that.go();

}

privatevoid go(){

frame = new JFrame("Null Layout Demo");

Container contentPane = frame.getContentPane();

//set the layout as null;

contentPane.setLayout(null);

//add the buttons

b1 = new JButton("Yes");

contentPane.add(b1);

b2 = new JButton("No");

contentPane.add(b2);

b3 = new JButton("Cancel");

contentPane.add(b3);

//set the buttons' pos and size;

b1.setBounds(30,15,75,20);

b2.setBounds(150,15,75,50);

b3.setBounds(150,100,75,20);

frame.setSize(300,200);

frame.setVisible(true);

}

}

import java.awt.*;
import javax.swing.*;

public class NullLayoutDemo{
private JFrame frame;
private JButton b1,b2,b3;

public static void main(String args[]){
NullLayoutDemo that = new NullLayoutDemo();
that.go();
}
private void go(){
frame = new JFrame("Null Layout Demo");
Container contentPane = frame.getContentPane();

//set the layout as null;
contentPane.setLayout(null);

//add the buttons
b1 = new JButton("Yes");
contentPane.add(b1);
b2 = new JButton("No");
contentPane.add(b2);
b3 = new JButton("Cancel");
contentPane.add(b3);

//set the buttons' pos and size;
b1.setBounds(30,15,75,20);
b2.setBounds(150,15,75,50);
b3.setBounds(150,100,75,20);

frame.setSize(300,200);
frame.setVisible(true);
}
}


7.3执行结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: