GUI界面,Swing、JTextPane面板、事件驱动模型(监听器)

1.Swing

	之前学习的AWT底层并不是纯Java开发,因此不同平台展示效果并不相同,而且支持控件太少,为此开发了Swing组件。
	Swing是纯Java实现,各平台显示效果一样。此外,Swing采用MVC设计模式(Model-View-Controller),其中模型来保存内容,视图用来显示内容,控制器用来控制用户输入。

1.1Swing的类层次结构

在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件。

1.2Swing容器与组件

Swing是AWT的扩展,以“J”开头,除了有AWT类似的按钮(JButton)、标签(JLabel)等基本组件,还增加了高层组件集合,如表格(JTable)、树(JTree).
Swing的程序设计一般可按照下列流程进行
  1. 引入Swing包
  2. 设置顶层容器
  3. 设置按钮和标签
  4. 想容器中添加组件
  5. 进行事件处理
3.2.1按钮、标签、文本框、密码框、文本域
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MyFrame extends JFrame {
	public MyFrame(String title) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			UnsupportedLookAndFeelException {
		super(title);
		// 设置大小
		this.setSize(400, 400);
		// 设置外观和感觉
		/*
		 * 这是设置图形界面外观的.java的图形界面外观有3种,默认是java的金属外观,还有就是windows系统,motif系统外观.
		 * UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		 * 这是把外观设置成你所使用的平台的外观,也就是你这个程序在哪个平台运行,显示的窗口,对话框外观将是哪个平台的外观
		 */
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		// 设置布局管理器
		this.setLayout(new GridLayout(10, 1));
		// 将标签面板添加到窗口
		this.getContentPane().add(getLabel());
		// 用户名面板添加到窗口
		this.getContentPane().add(getMyName());
		// 密码框
		this.getContentPane().add(getMyPassword());
		// 将按钮面板添加到窗口
		this.getContentPane().add(getButton());
		// 文本域
		this.getContentPane().add(getTestArea());
		// 设置默认关闭窗口,不添加关闭的话,如果点击窗口右上角X关闭窗口,虽然窗口不见了但是进程里面还是在继续运行
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置可见
		this.setVisible(true);
	}

	private Component getButton() {
		// 创建面板
		JPanel panel = new JPanel();
		// 设置布局管理器
		panel.setLayout(new FlowLayout());// 流式布局
		JButton but = new JButton("登    录");
		// 将按钮添加到面板
		panel.add(but);
		return panel;
	}

	/* 标签 */
	private JPanel getLabel() {
		JPanel panel = new JPanel();
		panel.add(new JLabel("用户登录"), BorderLayout.CENTER);
		return panel;
	}

	/* 用户账号输入 */
	private JPanel getMyName() {
		JPanel jp = new JPanel(new FlowLayout());
		jp.add(new JLabel("用户名:"));
		jp.add(new JTextField(16));
		return jp;
	}

	/* 用户密码输入 */
	private JPanel getMyPassword() {
		JPanel jp = new JPanel(new FlowLayout());
		jp.add(new JLabel("用户名:"));
		jp.add(new JPasswordField(16));
		return jp;
	}

	/* 文本域说明 */
	private JPanel getTestArea() {
		JPanel jp = new JPanel();
		jp.add(new JTextArea("文本域说明:", 6, 20), BorderLayout.CENTER);
		return jp;
	}

	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			UnsupportedLookAndFeelException {
		MyFrame myFrame = new MyFrame("按钮、标签、输入框、密码框、文本域");
	}
}

2.事件驱动模型

事件驱动模型的三大要素
  • 事件源:能够接收外部事件的源体
  • 监听器:能够接收事件源通知的对象
  • 事件处理程序:用于处理事件的对象
java.awt中的组件实现事件处理必须使用java.awt.event包
事件类AWTEvent中分为三大类:
  • ActionEvent类(动作事件)
  • MouseEvent类(鼠标事件)
  • KeyEvent类(键盘事件)

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Event extends JFrame{
	public Event(String title) {
		super(title);
		//设置大小
		this.setSize(300, 200);
		//设置位置
		this.setLocation(500, 300);
		JPanel panel = new JPanel(new GridLayout());
		JButton but = new JButton("点击我");
		panel.add(but);
		//1.给按钮添加点击事件
		but.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {//点击按钮
				System.out.println("点击了我!!");
			}
		});
		//2.窗口事件
		this.addWindowListener(new WindowListener() {
			
			@Override
			public void windowOpened(WindowEvent e) {
				// 窗口打开后
				
			}
			
			@Override
			public void windowIconified(WindowEvent e) {
				// 窗口最小化时
				
			}
			
			@Override
			public void windowDeiconified(WindowEvent e) {
				// 窗口最小化后还原时
				
			}
			
			@Override
			public void windowDeactivated(WindowEvent e) {
				// 窗口失去焦点时
				
			}
			
			@Override
			public void windowClosing(WindowEvent e) {
				// 窗口关闭时
				System.out.println("窗口关闭时");
				System.exit(0);
			}
			
			@Override
			public void windowClosed(WindowEvent e) {
				// 窗口关闭后
				
			}
			
			@Override
			public void windowActivated(WindowEvent e) {
				// 窗口激活时
				
			}
		});
		//3.使用适配器,可以不用实现全部的方法,只需实现需要的就好
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowOpened(WindowEvent e) {
				// 窗口打开后
				System.out.println("打开了一个窗口");
			}
		});
		this.getContentPane().add(panel);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new Event("点击事件");
	}
}

3.JTextPane面板

JTxtPane的两个常用属性:
  • SimpleAttributeSet:简单属性设置
  • StyleConstant:对齐方式、背景色、颜色、粗体、首行缩进、字体属性、字体大小等

import java.awt.Color;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class JTextPane1 {
	private JTextPane textPane;

	public JTextPane1() {
		textPane = new JTextPane();
		textPane.setBackground(Color.black);
		textPane.setEditable(false);
	}
	
	public void setRed_UnderLine_Italic_24(String str) {
		SimpleAttributeSet attrset = new SimpleAttributeSet();//简单属性设置SimpleAttributeSet
		StyleConstants.setForeground(attrset, Color.red);//设置字体颜色
		StyleConstants.setUnderline(attrset, true);//字体带下划线
		StyleConstants.setItalic(attrset, true);//字体倾斜
		StyleConstants.setBold(attrset, true);//粗体
		StyleConstants.setFontSize(attrset, 24);//字体大小设置
		insert(str, attrset);
	}

	// 这个方法最主要的用途是将字符串插入到JTextPane中
	private void insert(String str, SimpleAttributeSet attrset) {
		Document docs = textPane.getDocument();//Document文档doc
		// 利用getDocument()方法取得JTextPane的Document instance.0
		str = str + "\n";
		try {
			docs.insertString(docs.getLength(), str, attrset);
		} catch (BadLocationException e) {
			System.out.println("BadLocationException:" + e);
			e.printStackTrace();
		}
	}

	public Component getComponent() {
		return textPane;
	}

	public static void main(String[] args) {
		JTextPane1 pane = new JTextPane1();
		pane.setRed_UnderLine_Italic_24("这是第三行,红色,underLine下划线,斜体,大小24");
		JFrame f = new JFrame("文本面板");
		f.getContentPane().add(pane.getComponent());
		f.setSize(450, 300);
		f.setVisible(true);
		f.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值