第18章 Swing 程序设计

1 Swing概述
  Swing 主要用来开发 GUI 程序,GUI 是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮等图形界面元素。Java语言为 Swing 程序的开发提供了丰富的类库,这些类分别被存储在 java.awt 和 javax.swing 包中。

        Swing 组件是完全由Java语言编写的组件。因为Java语言不依赖于本地平台(即操作系统),所以 Swing 组件可以被应用于任何平台。

2:Swing常用窗体
2.1:JFrame窗体
 JFrame 类的常用构造方法包括以下两种形式:

public JFrame(): 创建一个初始不可见、没有标题的窗体。
public JFrame(String title): 创建一个不可见、具体标题的窗体。
        在创建窗体后,先调用 getContentPane() 方法将窗体转换为容器,再调用 add() 方法或者 remove() 方法向容器中添加组件或者删除容器中的组件。向容器中添加按钮,关键代码如下:

JButton okButn=new JButton("确定 ")

container.add(okButn);

删除容器中的按钮, 关键代码如下:

container.remove(okButn);

        在创建窗体后,要对窗体进行设置,如设置窗体的位置、大小、是否可见等。具体如下:

setBounds(int x , int y , int width , int length):  设置窗体左上角在屏幕中坐标为(x , y),窗体的宽度为 width,窗体的高度为height。
setLocation(int x , int y):  设置窗体左上角在屏幕中的坐标为(x , y)。
setSize(int width , int height): 设置窗体的宽度为 width,高度为 height。
setVisible(boolean b): 设置窗体是否可见。b 为 true 时,表示可加;b 为 false 时,表示不可见。
setDefaultCloseOperation(int operation):  设置窗体的关闭方式,默认值为 DISPOSE_NO_CLOSE。

代码

package eightth;
 
import java.awt.*; //导入AWT包
import javax.swing.*; //导入Swing包
 
public class JFreamTest {
	public static void main(String args[]) { // 主方法
		JFrame jf = new JFrame();// 创建窗体对象
		jf.setTitle("创建一个JFrame窗体");// 设置窗体标题
		Container container = jf.getContentPane(); // 获取主容器
		JLabel jl = new JLabel("这是一个JFrame窗体");// 一个文本标签
		jl.setHorizontalAlignment(SwingConstants.CENTER); // 使标签上的文字居中
		container.add(jl); // 将标签添加到主容器中
		jf.setSize(300, 150); // 设置窗体宽高
		jf.setLocation(320, 240);// 设置窗体在屏幕中出现的位置
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭窗体则停止程序
		jf.setVisible(true); // 让窗体展示出来
	}
}
//例题18.1

 结果

2.2:JDialog对话框
JDialog 对话框继承了 java.awt.Dialog 类,其功能是从一个窗体中弹出另一个窗体,如使用 IE 浏览器时弹出的确定对话框。JDialog 对话框与JFrame 窗体类似,被使用时也需 getContentPane() 方法把 JDialog 对话框转换为容器,再对 JDialog 对话框进行设置。

 代码

package eightth;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
class MyJDialog extends JDialog { // 自定义对话框类,继承JDialog
	public MyJDialog(MyFrame frame) {
		// 调用父类构造方法,第一个参数是父窗体,第二个参数是窗体标题,第三个参数表示阻塞父窗体
		super(frame, "第一个JDialog窗体", true);
		Container container = getContentPane(); // 获取主容器
		container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
		setBounds(120, 120, 100, 100); // 设置对话框窗体在桌面显示的坐标和大小
	}
}
 
public class MyFrame extends JFrame { // 自定义窗体类,继承JFrame
	public MyFrame() {// 窗体的构造方法
		Container container = getContentPane(); // 获得窗体主容器
		container.setLayout(null); // 容器使用绝对布局
		JButton bl = new JButton("弹出对话框"); // 创建一个按钮
		bl.setBounds(10, 10, 100, 21); // 定义按钮在容器中的坐标和大小
		bl.addActionListener(new ActionListener() { // 为按钮添加点击事件
			public void actionPerformed(ActionEvent e) {// 点击事件触发的方法
				MyJDialog dialog = new MyJDialog(MyFrame.this); // 创建MyJDialo对话框
				dialog.setVisible(true); // 使对话框可见
			}
		});
		container.add(bl); // 将按钮添加到容器中
		setSize(200, 200); // 窗体的宽高
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭窗体则停止程序
		setVisible(true); // 使窗体可见
	}
 
	public static void main(String args[]) {
		new MyFrame();
	}
}
//例题18.2

结果

 

2.3:JOptionPane小型对话框

Java API 中的,Javax.swing,JOptionPane 类时一个非常简便的小型对话框类,该类用于创建对话框的方法都是静态方法,无须创建对象即可弹出。在日常开发中经常使用该类弹出提示、确认用户需要、调试程序等

1.通知框
代码
package eightth;
 
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
 
public class Demo {
	public static void main(String[] args) {
		Object o[] = {new JButton("是的"), new JButton("再想想")};   // 按钮对象的Object数组
		Icon icon = new ImageIcon("src/注意.png");                      // 获取图标对象
		JOptionPane.showOptionDialog(null, "你做好准备了吗?", "注意了!",
		JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION, icon, o, null);
 
	}
}
//例题18.3

结果

 

 

 2.确认框
代码
package eightth;
import javax.swing.JOptionPane;
public class Demo4 {
	public static void main(String[] args) {
		int answer = JOptionPane.showConfirmDialog(null,
				"确定离开吗?",
				"标题",
				JOptionPane.YES_NO_OPTION);
	}
}
 
//例题18.4

 

package eightth;
import javax.swing.JOptionPane;
public class Demo4 {
	public static void main(String[] args) {
		int answer = JOptionPane.showConfirmDialog(null,
				"确定离开吗?",
				"标题",
				JOptionPane.YES_NO_CANCEL_OPTION);
	}
}
 
//例题18.4

 结果

 

3.输入框
代码
package eightth;
 
 
import javax.swing.JOptionPane;
 
public class Demo5 {
	public static void main(String[] args) {
		String name = JOptionPane.showInputDialog(null, "请输入您的姓名");
	}
}
//例题18.5

结果

 

 4.通知框
代码
package eightth;
 
 
import javax.swing.JOptionPane;
 
public class Demo6 {
	public static void main(String[] args) {
		JOptionPane.showMessageDialog(null, 
				"您与服务器断开了连接", 
				"发生错误", 
				JOptionPane.ERROR_MESSAGE);
	}
}
//例题18.6

结果

 

3:常用布局管理器 
3.1:null绝对布局
 绝对布局也叫 null 布局,其特点是硬性指定组件在容器中的位置大小,组件的位置通过绝对坐标的方式来指定。使用绝对布局首先使用 Container.seLayout(null)方法取消容器的布局管理器,然后再使用 Component.setBounds(int x,int y,int width,int height)方法设置每个组件在容器中的位置和大小。

3.2:BorderLayout边界布局管理器
 使用 Swing 创建窗体后,容器默认的布局管理器是边界布局(BorderLayout )管理器 ,边界布局把容量划分为东、南、西、北、中5个区域,但组件被添加到设置为边界布局管理器的容器时,需要使用 BorderLayout 类中成员变量指定被添加的组件在边界布局管理器中的区域。

代码

package eightth;
 
import java.awt.*;
import javax.swing.*;
public class AbsolutePosition extends JFrame {
    public AbsolutePosition() {
        setTitle("本窗体使用绝对布局");               // 窗体标题
        setLayout(null);                              // 使用null布局
        setBounds(0, 0, 300, 150);                  // 设置窗体的坐标与宽高
        Container c = getContentPane();            // 获取主容器
        JButton b1 = new JButton("按钮1");          // 创建按钮
        JButton b2 = new JButton("按钮2"); 
        b1.setBounds(10, 30, 80, 30);               // 设置按钮的位置与大小
        b2.setBounds(60, 70, 100, 20);
        c.add(b1); // 将按钮添加到容器中
        c.add(b2);
        setVisible(true);                               // 使窗体可见
      
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   // 关闭窗体则停止程序
    }
    public static void main(String[] args) {
        new AbsolutePosition();
    }
}
 
//例题18.7

结果

 

代码

package eightth;
import java.awt.*;
import javax.swing.*;
public class FlowLayoutPosition extends JFrame {
    public FlowLayoutPosition() {
        setTitle("本窗体使用流布局管理器");       // 设置窗体标题
        Container c = getContentPane();
        // 窗体使用流布局,组件右对齐,组件之间的水平间隔为10像素,垂直间隔10像素
        setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
        for (int i = 0; i < 10; i++) {        // 在容器中循环添加10个按钮
            c.add(new JButton("button" + i));
        }
        setSize(300, 200);                    // 设置窗体大小
       
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 关闭窗体则停止程序
        setVisible(true);                    // 设置窗体可见
    }
    public static void main(String[] args) {
        new FlowLayoutPosition();
    }
}
 
 
//例题18.8

结果

 

 

 代码 

package eightth;
 
import java.awt.*;
import javax.swing.*;
 
public class BorderLayoutPosition extends JFrame {
	public BorderLayoutPosition() {
		setTitle("这个窗体使用边界布局管理器");
		Container c = getContentPane(); // 获取主容器
		setLayout(new BorderLayout()); // 容器使用边界布局
		JButton centerBtn = new JButton("中");
		JButton northBtn = new JButton("北");
		JButton southBtn = new JButton("南");
		JButton westBtn = new JButton("西");
		JButton eastBtn = new JButton("东");
		c.add(centerBtn, BorderLayout.CENTER); // 中部添加按钮
		c.add(northBtn, BorderLayout.NORTH); // 北部添加按钮
		c.add(southBtn, BorderLayout.SOUTH); // 南部添加按钮
		c.add(westBtn, BorderLayout.WEST); // 西部添加按钮
		c.add(eastBtn, BorderLayout.EAST); // 东部添加按钮
		setSize(350, 200); // 设置窗体大小
		setVisible(true); // 设置窗体可见
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 关闭窗体则停止程序
	}
 
	public static void main(String[] args) {
		new BorderLayoutPosition();
	}
}
//18.9

结果

 

3.4:GridLayout网格布局管理器

 网格布局(GridLayout)管理器能够把容器划分为网格,组件可以按行、列进行排序。在网格布局管理器中,网格的个数由行数和列数决定,且每个网格的小大都相同。改变窗体大小时,组件的大小也会随之改变。

代码
package eightth;
import java.awt.*;
import javax.swing.*;
public class GridLayoutPosition extends JFrame {
    public GridLayoutPosition() {
        Container c = getContentPane();
    	   // 设置容器使用网格布局管理器,设置7行3列的网格。组件间水平间距为5像素,垂直间距为5像素
        setLayout(new GridLayout(7, 3, 5, 5));
        for (int i = 0; i < 20; i++) {
            c.add(new JButton("button" + i));   // 循环添加按钮
        }
        setSize(300, 300);
        setTitle("这是一个使用网格布局管理器的窗体");
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new GridLayoutPosition();
    }
}
 
//例题18.10

结果

 

4:常用面板

4.1:JPanel面板

JPanel 面板 继承 java.awt.Container 类。JPanel 面板必须放在窗体容器中使用,无法摆脱窗体显示。

代码
package eightth;
 
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
 
public class JPanelTest extends JFrame {
	public JPanelTest() {
		Container c = getContentPane();
		// 将整个容器设置为2行2列的网格布局,组件水平间隔10像素,垂直间隔10像素
		c.setLayout(new GridLayout(2, 2, 10, 10));
		// 初始化一个面板,此面板使用1行4列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p1 = new JPanel(new GridLayout(1, 4, 10, 10));
		// 初始化一个面板,此面板使用边界布局
		JPanel p2 = new JPanel(new BorderLayout());
		// 初始化一个面板,此面板使用1行2列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
		// 初始化一个面板,此面板使用2行1列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
		// 给每个面板都添加边框和标题,使用BorderFactory工厂类生成带标题的边框对象
		p1.setBorder(BorderFactory.createTitledBorder("面板1"));
		p2.setBorder(BorderFactory.createTitledBorder("面板2"));
		p3.setBorder(BorderFactory.createTitledBorder("面板3"));
		p4.setBorder(BorderFactory.createTitledBorder("面板4"));
		// 在面板1中添加按钮
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		// 向面板2中添加按钮
		p2.add(new JButton("b2"), BorderLayout.WEST);
		p2.add(new JButton("b2"), BorderLayout.EAST);
		p2.add(new JButton("b2"), BorderLayout.NORTH);
		p2.add(new JButton("b2"), BorderLayout.SOUTH);
		p2.add(new JButton("b2"), BorderLayout.CENTER);
		// 向面板3中添加按钮
		p3.add(new JButton("b3"));
		p3.add(new JButton("b3"));
		// 向面板4中添加按钮
		p4.add(new JButton("b4"));
		p4.add(new JButton("b4"));
		// 向容器中添加面板
		c.add(p1);
		c.add(p2);
		c.add(p3);
		c.add(p4);
		setTitle("在这个窗体中使用了面板");
		setSize(500, 300);// 窗体宽高
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 关闭动作
	}
 
	public static void main(String[] args) {
		JPanelTest test = new JPanelTest();
		test.setVisible(true);
	}
}
//例题18.11

结果

 

 4.2:JScrollPane  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值