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的程序设计一般可按照下列流程进行
- 引入Swing包
- 设置顶层容器
- 设置按钮和标签
- 想容器中添加组件
- 进行事件处理
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);
}
});
}
}