Swing组件


一.Swing包

java.awt.Component-Container-JComponent
在Swing组件中大多数GUI组件都是Component类的直接子类或间接子类,JComponent类是Swing组件各种特性的存放位置。在Swing组件中最重要的父类是Container类,而Container类有两个最重要的子类:java.awt.Window和java.awt.Frame. 顶层父类是Component类和Container类,所以java关于窗口组件的编写,都与组件以及容器的概念相关联。
以下列举了常见的Swing组件:
JButton    代表Swing按钮,按钮可以带一些图片或文字
JCheckBox   代表Swing中的复选框组件
JComBox   代表下拉列表框
JFrame   代表Swing的框架类
JDialog   代表Swing版本的对话框
JLabel   代表Swing中的标签
JRadioButton   代表Swing中的单选按钮
JList   代表能在用户界面中显示一系列条目的组件
JTextField   代表文本框 
JPasswordField   代表密码框
JTextArea   代表Swing中的文本区域
JOptionPane   代表Swing中的一些对话框

二.常见窗体

1.JFrame窗体

JFrame窗体是一个容器,它是Swing程序中各个组件的载体。
java为窗体关闭提供了多种方式,常用的有以下4种: DO_NOTHING_ON_CLOSE: 窗体退出方式是什么都不做就把窗体关闭;  DISPOSE_ON_CLOSE: 代表任何注册监听程序对象后会自动隐藏并释放窗体; HIDE_ON_CLOSE:表示隐藏窗口的默认窗口关闭;   EXIT_ON_CLOSE:表示退出应用程序默认窗口关闭。

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {
	private static final long serialVersionUID = 1L;

	// 定义一个类继承JFrame类
	public void CreateJFrame(String title) { // 定义一个CreateJFrame()方法
		JFrame jf = new JFrame(title); // 实例化一个JFrame对象
		Container container = jf.getContentPane(); // 获取一个容器
		JLabel jl = new JLabel("这是一个JFrame窗体"); // 创建一个JLabel标签

		jl.setHorizontalAlignment(SwingConstants.CENTER);// 使标签上的文字居中
		container.add(jl); // 将标签添加到容器中
		container.setBackground(Color.gray);// 设置容器的背景颜色
		jf.setVisible(true); // 使窗体可视
		jf.setSize(200, 150); // 设置窗体大小
		// 设置窗体关闭方式
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String args[]) {// 在主方法中调用createJFrame()方法
		new Example().CreateJFrame("创建一个JFrame窗体");
	}
}


2.JDialog窗体

同JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
在应用程序中创建JDialog窗体需要实例化JDialog类,通常使用以下JDialog类的构造方法。
public JDialog(Frame f,String title,boolean model) : 创建一个指定窗口标题、模式的对话框。

package hello;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

class MyJDialog extends JDialog { // 创建新类继承JDialog类

	private static final long serialVersionUID = 1L;

	public MyJDialog(Example frame) {
		// 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
		super(frame, "第一个JDialog窗体", true);
		Container container = getContentPane(); // 创建一个容器
		container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
		setBounds(120, 120, 100, 100); // 设置对话框窗体大小
	}
}

public class Example extends JFrame { // 创建新类

	private static final long serialVersionUID = 1L;

	public static void main(String args[]) {
		new Example(); // 实例化MyJDialog类对象
	}
	
	public Example() {
		Container container = getContentPane(); // 创建一个容器
		container.setLayout(null);
		JLabel jl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
		jl.setHorizontalAlignment(SwingConstants.CENTER);// 将标签的文字置于标签中间位置
		container.add(jl);
		JButton bl = new JButton("弹出对话框"); // 定义一个按钮
		bl.setBounds(10, 10, 100, 21);
		bl.addActionListener(new ActionListener() { // 为按钮添加鼠标单击事件
					public void actionPerformed(ActionEvent e) {
						new MyJDialog(Example.this).setVisible(true);
					}
				});
		container.add(bl); // 将按钮添加到容器中
		
		container.add(bl);
		container.setBackground(Color.white);
		setSize(200, 200);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setVisible(true);
	}
}



三.标签组件与图标


1.标签

public JLabel(String text,Icon icon,int aligment): 创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。

2.图标的使用
(1)创建图标
public void paintIcon(Component arg(),Graphics arg1,int arg2,int arg3) 

package hello;

import java.awt.*;

import javax.swing.*;

public class Example implements Icon { // 实现Icon接口
	private int width; // 声明图标的宽
	private int height; // 声明图标的长

	public int getIconHeight() { // 实现getIconHeight()方法
		return this.height;
	}

	public int getIconWidth() { // 实现getIconWidth()方法
		return this.width;
	}

	public Example(int width, int height) { // 定义构造方法
		this.width = width;
		this.height = height;
	}

	// 实现paintIcon()方法
	public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
		arg1.fillOval(x, y, width, height); // 绘制一个圆形
	}

	public static void main(String[] args) {
		Example icon = new Example(15, 15);
		// 创建一个标签,并设置标签上的文字在标签正中间
		JLabel j = new JLabel("测试", icon, SwingConstants.CENTER);
		JFrame jf = new JFrame();
		Container c = jf.getContentPane();
		c.add(j);
		jf.setSize(250, 250);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}
}


(2)使用图片图标

ImageIcon类常用的构造方法:

public  ImageIcon(Image image,String description) :这个描述不会在图标上显示,可以使用getDescription()方法获取这个描述。
public ImageIcon(URL url) : 该构造方法利用位于计算机网络上的图像文件创建图标。

package hello;

import java.awt.*;
import java.net.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;

	public Example() {
		Container container = getContentPane();
		// 创建一个标签
		JLabel jl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
		// 获取图片所在的URL
		URL url = Example.class.getResource("/img/a1.jpg");
		Icon icon = new ImageIcon(url); // 实例化Icon对象
		jl.setIcon(icon); // 为标签设置图片
		// 设置文字放置在标签中间
		jl.setHorizontalAlignment(SwingConstants.CENTER);
		jl.setOpaque(true); // 设置标签为不透明状态
		container.add(jl); // 将标签添加到容器中
		setSize(400, 300);
		setVisible(true);
		// 设置窗体关闭模式
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String args[]) {
		new Example(); // 实例化MyImageIcon对象
	}
}



四.常见布局管理器


1.绝对布局
绝对布局,也就是硬性指定组件在容器中的位置和大小,使用绝对坐标的方式来指定组件的位置。
(1)使用Container.setLayout(null)方法取消布局管理器。
(2)使用Component.setBounds()方法设置每个组件的大小与位置

import java.awt.*;

import javax.swing.*;

public class AbsolutePosition extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public AbsolutePosition() {
		setTitle("本窗体使用绝对布局"); // 设置该窗体的标题
		setLayout(null); // 使该窗体取消布局管理器设置
		setBounds(0, 0, 200, 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();
	}
}



2.流布局 管理器

即像“流”一样从左向右摆放组件,直到占据这一行的所有空间,然后再向下移动一行。
FlowLayout类中常用的构造方法: public FlowLayout(int alignment,int horizGap,int vertGap);
alignment参数表示组件在每一行的具体摆放位置。
FlowLayout.LEFT=0;(左对齐)FlowLayout.CENTER=0;(居中)   FlowLayout.RIGHT=2;(右对齐)

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;

	public Example() {
		setTitle("本窗体使用流布局管理器"); // 设置窗体标题
		Container c = getContentPane();
		// 设置窗体使用流布局管理器,使组件右对齐,并且设置组件之间的水平间隔与垂直间隔
		setLayout(new FlowLayout(2, 10, 10));
		for (int i = 0; i < 10; i++) { // 在容器中循环添加10个按钮
			c.add(new JButton("button" + i));
		}
		setSize(300, 200); // 设置窗体大小
		setVisible(true); // 设置窗体可见
		// 设置窗体关闭方式
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}

	public static void main(String[] args) {
		new Example();
	}
}



3.边界布局管理器
 BorderLayout.CENTER 在容器中添加组件时,组件置于中间开始填充,直到与其他组件边界连接;   BorderLayout.NORTH 组件置于顶端   BorderLayout.SOUTH 组件置于底端
 BorderLayout.WEST组件置于左端    BorderLayout.EAST组件置于右端 

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;
	// 定义组件摆放位置的数组
	String[] border = { BorderLayout.CENTER, BorderLayout.NORTH,
			BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST };
	String[] buttonName = { "center button", "north button", "south button",
			"west button", "east button" };

	public Example() {
		setTitle("这个窗体使用边界布局管理器");
		Container c = getContentPane(); // 定义一个容器
		setLayout(new BorderLayout()); // 设置容器为边界布局管理器
		for (int i = 0; i < border.length; i++) {
			// 在容器中添加按钮,并设置按钮布局
			c.add(border[i], new JButton(buttonName[i]));
		}
		setSize(350, 200); // 设置窗体大小
		setVisible(true); // 使窗体可视
		// 设置窗体关闭方式
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}

	public static void main(String[] args) {
		new Example();
	}
}



4.网格布局管理器

每个组件的大小都相同,改变窗口的大小,组件的大小也会随之改变。常见的构造方法 public GridLayout(int rows,int columns,int horizGap,int vertGap);//代表网格的行数、列数、指定网格之间的水平间距、垂直间距。

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public Example() {
		Container c = getContentPane();
		// 设置容器使用网格布局管理器,设置7行3列的网格
		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 Example();
	}
}


五.常用面板

1.JPanel面板

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public Example() {
		Container c = getContentPane();
		// 将整个容器设置为2行1列的网格布局
		c.setLayout(new GridLayout(2, 1, 10, 10));
		// 初始化一个面板,设置1行3列的网格布局
		JPanel p1 = new JPanel(new GridLayout(1, 3, 10, 10));
		JPanel p2 = new JPanel(new GridLayout(1, 2, 10, 10));
		JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
		JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
		p1.add(new JButton("1")); // 在面板中添加按钮
		p1.add(new JButton("1"));
		p1.add(new JButton("2"));
		p1.add(new JButton("3"));
		p2.add(new JButton("4"));
		p2.add(new JButton("5"));
		p3.add(new JButton("6"));
		p3.add(new JButton("7"));
		p4.add(new JButton("8"));
		p4.add(new JButton("9"));
		c.add(p1); // 在容器中添加面板
		c.add(p2);
		c.add(p3);
		c.add(p4);
		setTitle("在这个窗体中使用了面板");
		setSize(420, 200);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}

	public static void main(String[] args) {
		new Example();
	}
}




2.JScrollPane面板

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;

	public Example() {
		Container c = getContentPane(); // 创建容器
		JTextArea ta = new JTextArea(20, 50); // 创建文本区域组件
		JScrollPane sp = new JScrollPane(ta); // 创建JScrollPane面板对象
		c.add(sp); // 将该面板添加到该容器中
		setTitle("带滚动条的文字编译器");
		setSize(300, 300);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}

	public static void main(String[] args) {
		new Example();
	}

}


六.按钮组件

1.提交按钮组件

用JButton对象表示,构造方法 public JButton( String text,Icon icon);

package hello;

import java.awt.*;
import java.awt.event.*;
import java.net.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;

	public Example() {
		URL url = Example.class.getResource("/img/imageButtoo.jpg");
		Icon icon = new ImageIcon(url);
		setLayout(new GridLayout(3, 2, 5, 5)); // 设置网格布局管理器
		Container c = getContentPane(); // 创建容器
		for (int i = 0; i < 5; i++) {
			// 创建按钮,同时设置按钮文字与图标
			JButton J = new JButton("button" + i, icon);
			c.add(J); // 在容器中添加按钮
			if (i % 2 == 0) {
				J.setEnabled(false); // 设置其中一些按钮不可用
			}
		}
		JButton jb = new JButton(); // 实例化一个没有文字与图片的按钮
		jb.setMaximumSize(new Dimension(90, 30)); // 设置按钮与图片相同大小
		jb.setIcon(icon); // 为按钮设置图标
		jb.setHideActionText(true);
		jb.setToolTipText("图片按钮"); // 设置按钮提示为文字
		jb.setBorderPainted(false); // 设置按钮边界不显示
		jb.addActionListener(new ActionListener() { // 为按钮添加监听事件
			public void actionPerformed(ActionEvent e) {
				// 弹出确认对话框
				JOptionPane.showMessageDialog(null, "弹出对话框");
			}
		});
		c.add(jb); // 将按钮添加到容器中

		setTitle("创建带文字与图片的按钮");
		setSize(350, 150);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}

	public static void main(String args[]) {
		new Example();
	}
}



2.单选按钮组件

单选按钮
public JRadioButton(String text,Icon icon,boolean selected);
按钮组
JRadioButton jr1=new JRadioButton();
JRadioButton jr2=new JRadioButton();
JRadioButton jr3=new JRadioButton();
group.add(jr1);
group.add(jr2);
group.add(jr3);

3.复选框组件

JCheckBox 常见的构造方法: public JCheckBox(String text,Boolean checked);

package hello;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Example extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel panel1 = new JPanel();
	private JPanel panel2 = new JPanel();
	private JTextArea jt = new JTextArea(3, 10);
	private JCheckBox jc1 = new JCheckBox("1");
	private JCheckBox jc2 = new JCheckBox("2");
	private JCheckBox jc3 = new JCheckBox("3");

	public Example() {
		Container c = getContentPane();
		setSize(200, 160);
		setVisible(true);
		setTitle("复选框的使用");
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		c.setLayout(new BorderLayout());

		c.add(panel1, BorderLayout.NORTH);
		final JScrollPane scrollPane = new JScrollPane(jt);
		panel1.add(scrollPane);

		c.add(panel2, BorderLayout.SOUTH);
		panel2.add(jc1);
		jc1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (jc1.isSelected())
					jt.append("复选框1被选中\n");
			}
		});

		panel2.add(jc2);
		jc2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (jc2.isSelected())
					jt.append("复选框2被选中\n");
			}
		});

		panel2.add(jc3);
		jc3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (jc3.isSelected())
					jt.append("复选框3被选中\n");
			}
		});
	}

	public static void main(String[] args) {
		new Example();
	}
}


七.列表组件

1.下拉列表框组件

ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后在初始化JComboBox对象时向上转型为ComboBoxModel接口类型, 还可以继承AbstractListModel类。

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {
	
	private static final long serialVersionUID = 1L;
	JComboBox<String> jc = new JComboBox<>(new MyComboBox());
	JLabel jl = new JLabel("请选择证件:");
	
	public Example() {
		setSize(new Dimension(160, 180));
		setVisible(true);
		setTitle("在窗口中设置下拉列表框");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout());
		cp.add(jl);
		cp.add(jc);
	}
	
	public static void main(String[] args) {
		new Example();
	}
}

class MyComboBox extends AbstractListModel<String> implements ComboBoxModel<String> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String selecteditem = null;
	String[] test = { "身份证", "军人证", "学生证", "工作证" };
	
	public String getElementAt(int index) {
		return test[index];
	}
	
	public int getSize() {
		return test.length;
	}
	
	public void setSelectedItem(Object item) {
		selecteditem = (String) item;
	}
	
	public Object getSelectedItem() {
		return selecteditem;
	}
	
	public int getIndex() {
		for (int i = 0; i < test.length; i++) {
			if (test[i].equals(getSelectedItem()))
				return i;
		}
		return 0;
	}
}




2.列表框组件

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public Example() {
		Container cp = getContentPane();
		
		cp.setLayout(null);
		JList<String> jl = new JList<>(new MyListModel());
		JScrollPane js = new JScrollPane(jl);
		js.setBounds(10, 10, 100, 100);
		cp.add(js);
		setTitle("在这个窗体中使用了列表框");
		setSize(200, 150);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}
	
	public static void main(String args[]) {
		new Example();
	}
}

class MyListModel extends AbstractListModel<String> {
	
	private static final long serialVersionUID = 1L;
	private String[] contents = { "列表1", "列表2", "列表3", "列表4", "列表5", "列表6" };
	
	public String getElementAt(int x) {
		if (x < contents.length)
			return contents[x++];
		else
			return null;
	}
	
	public int getSize() {
		return contents.length;
	}
}


八.文本组件

1.文本框组件

package hello;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Example extends JFrame{

	private static final long serialVersionUID = 1L;
	public Example(){
		setSize(250,100);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp=getContentPane();
		getContentPane().setLayout(new FlowLayout());
		final JTextField jt=new JTextField("aaa",20);
		final JButton jb=new JButton("清除");
		cp.add(jt);
		cp.add(jb);
		jt.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				// TODO 自动生成方法存根
				jt.setText("触发事件");
			}
		});
		jb.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				jt.setText("");
				jt.requestFocus();
			}
		});	
		setVisible(true);
	}
	public static void main(String[] args) {
		new Example();
	}
}



2.密码框组件

JPasswordField jp=new JPasswordField();
jp.setEchoChar('#');  //设置回显字符

3.文本域组件

package hello;

import java.awt.*;

import javax.swing.*;

public class Example extends JFrame{

	private static final long serialVersionUID = 1L;
	public Example(){
		setSize(200,100);
		setTitle("定义自动换行的文本域");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp=getContentPane();
		JTextArea jt=new JTextArea("文本域",6,6);
		jt.setLineWrap(true);//可以自动换行
		cp.add(jt);
		setVisible(true);
	}
	public static void main(String[] args) {
		new Example();
	}
}










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值