[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程

简介: [笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程

第12章 Swing编程


12.1 Swing概述


实际开发Java图形界面程序时,很少使用AWT组件,绝大部分时候使用Swing组件开发。


Swing由100% 纯Java实现,不再依赖本地平台的GUI。


Swing具有两个特征:


1、采用MVC(Model-View-Controller)设计模式。


2、在不同平台上表现一致。


//获取当前支持的LAF(LookAndFeel)
import javax.swing.UIManager;
import java.swing.*;
public class AlllLookAndFeel
{
public static void main(String[] args) {
System.out.println(“可用LAF”);
for(UIManager.LookAndFeelInfo info:
UIManager.getInstalledLookAndFeels()){
System.out.println(info.getName()+" "+info);
}
}
}


12.2 Swing基本组件的用法


Swing为所有AWT组件提供对应实现,通常在AWT组件的组件名前加J就变成了对应的Swing组件。


12.2.1 Java7的Swing组件层次


12.2.2 AWT组件的Swing实现


相比AWT组件,Swing组件提供如下4个额外功能:


1、设置提示信息:setToolTipText()


2、使用图表修饰,Swing为Icon接口提供一个实现类ImageIcon。


3、支持拔插式的外观风格。 每个JComponent对象有一个对应的ComponentUI对象,为它实现会话、事件处理等工作,ComponentUI对象依赖当前使用的PLAF,


使用UIManager.setLookAndFeel()可以改变外观风格。


4、支持设置边框。


每个Swing组件都有一个对应的UI类,是将J去掉然后加UI后缀。


//使用Swing组件创建窗口,功能基本没实现。实现了右键改变窗口风格
import java.awt.BorderLayout;
import java.awt.event.InputEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class SwingComponent
{
JFrame f = new JFrame(“测试”);
Icon okIcon = new ImageIcon(“ico/ok.png”);
JButton ok = new JButton(“确认”,okIcon);
JRadioButton male = new JRadioButton(“男”,true);
JRadioButton female = new JRadioButton(“女”,false);
ButtonGroup bg = new ButtonGroup();
JCheckBox married = new JCheckBox(“是否已婚?”,false);
String[] colors = new String[]{“红”,“黄”,“蓝”};
JComboBox<String> colorChooser = new JComboBox<>(colors);
JList<String> colorList = new JList<>(colors);
JTextArea ta = new JTextArea(8,20);
JTextField name = new JTextField(40);
JMenuBar mb = new JMenuBar();
JMenu file = new JMenu(“文件”);
JMenu edit = new JMenu(“编辑”);
Icon newIcon = new ImageIcon(“D://TEST//java//ch12//ico//new.png”);
JMenuItem newItem = new JMenuItem(“新建”,newIcon);
Icon saveIcon = new ImageIcon(“D://TEST//java//ch12//ico//save.png”);
JMenuItem saveItem = new JMenuItem(“保存”,saveIcon);
Icon exitIcon = new ImageIcon(“D://TEST//java//ch12//ico//exit.png”);
JMenuItem exitItem = new JMenuItem(“退出”,exitIcon);
JCheckBoxMenuItem autoWrap = new JCheckBoxMenuItem(“自动换行”);
JMenuItem copyItem = new JMenuItem(“复制”,new ImageIcon(“D://TEST//java//ch12//ico//copy.png”));
JMenuItem pasteItem = new JMenuItem(“粘贴”,new ImageIcon(“D://TEST//java//ch12//ico//paste.png”));
JMenu format = new JMenu(“格式”);
JMenuItem commentItem = new JMenuItem(“注释”);
JMenuItem cancelItem = new JMenuItem(“取消注释”);
JPopupMenu pop = new JPopupMenu();
ButtonGroup flavorGroup = new ButtonGroup();
JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem(“Metal”,true);
JRadioButtonMenuItem nimbuslItem = new JRadioButtonMenuItem(“Nimbus”);
JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem(“Windows”);
JRadioButtonMenuItem classicItem = new JRadioButtonMenuItem(“Classic”);
JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem(“Motif”);
public void init()
{
JPanel bottom = new JPanel();
bottom.add(name);
bottom.add(ok);
f.add(bottom,BorderLayout.SOUTH);
JPanel checkPanel = new JPanel();
checkPanel.add(colorChooser);
bg.add(male);
bg.add(female);
checkPanel.add(male);
checkPanel.add(female);
checkPanel.add(married);
Box topLeft = Box.createVerticalBox();
JScrollPane taJsp = new JScrollPane(ta);
topLeft.add(taJsp);
topLeft.add(checkPanel);
Box top = Box.createHorizontalBox();
top.add(topLeft);
top.add(colorList);
f.add(top);
newItem.setAccelerator(KeyStroke.getKeyStroke(‘N’, InputEvent.CTRL_DOWN_MASK));//java 9后不推荐使用CTRL_MASK
newItem.addActionListener(e->ta.append(“用户单击了"新建菜单”\n"));
file.add(newItem);
file.add(saveItem);
file.add(exitItem);
edit.add(autoWrap);
edit.addSeparator();
edit.add(copyItem);
edit.add(pasteItem);
commentItem.setToolTipText(“将代码注释起来”);
format.add(commentItem);
format.add(cancelItem);
edit.add(new JMenuItem("-"));
edit.add(format);
mb.add(file);
mb.add(edit);
f.setJMenuBar(mb);
flavorGroup.add(metalItem);
flavorGroup.add(nimbuslItem);
flavorGroup.add(windowsItem);
flavorGroup.add(classicItem);
flavorGroup.add(motifItem);
pop.add(metalItem);
pop.add(nimbuslItem);
pop.add(windowsItem);
pop.add(classicItem);
pop.add(motifItem);
ActionListener flavorListener = e->{
try{
switch (e.getActionCommand()) {
case “Metal风格”:
changeFlavor(1);
break;
case “Nimbus风格”:
changeFlavor(2);
case “Windows风格”:
changeFlavor(3);
case “Windows经典风格”:
changeFlavor(4);
case “Motif风格”:
changeFlavor(5);
default:
break;
}
}
catch(Exception ee){
ee.printStackTrace();
}
};
metalItem.addActionListener(flavorListener);
nimbuslItem.addActionListener(flavorListener);
windowsItem.addActionListener(flavorListener);
classicItem.addActionListener(flavorListener);
motifItem.addActionListener(flavorListener);
ta.setComponentPopupMenu(pop);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
private void changeFlavor(int flavor) throws Exception{
switch(flavor){
case 1:
UIManager.setLookAndFeel(“javax.swing.plaf.metal.MetalLookAndFeel”);
break;
case 2:
UIManager.setLookAndFeel(“javax.swing.plaf.nimbus.NimbusLookAndFeel”);
break;
case 3:
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.motif.MotifLookAndFeel”);
break;
case 4:
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”);
break;
case 5:
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel”);
break;
}
SwingUtilities.updateComponentTreeUI(f.getContentPane());
SwingUtilities.updateComponentTreeUI(mb);
SwingUtilities.updateComponentTreeUI(pop);
}
public static void main(String[] args) {
new SwingComponent().init();
}
}


12.2.3 为组件设置边框


setBorder(Border b)


为Swing组件添加边框可按如下步骤进行;


1、使用BorderFactory或XXXBorder创建XxxBorder实例


2、调用setBorder(Border b)方法


12.2.4 Swing组件的双缓冲和键盘驱动


Swing组件默认采用双缓冲绘图技术,有效改善频繁绘制GUI组件的显示效果(避免闪烁现象)


JComponent 提供了getInputMap()和getActionMap()方法,允许用户通过键盘操作代替鼠标驱动。相当于快捷键。


getInputMap()返回一个InputMap对象,用于将KeyStroke对象和名字关联;getActionMap()返回一个ActionMap对象,用于将名字和Action关联。


典型用法:


component.getInputMap().put(aKeyStroke,aCommand);


component.getActionMap().put(aCommand,anAction);


12.2.5 使用JToolBar创建工具条


12.2.6 使用JFileChooser和Java 7增强的JColorChooser


用于选择文件和 选择颜色。


12.2.7 使用JOptionPane


用于弹出各种类型对话框。


12.3 Swing中的特殊容器


12.3.1 使用JSplitPane


用于创建一个分割面板


12.3.2 使用JTabbedPane


可以在窗口上放置多个标签页。


12.3.3 使用JLayeredPane、JDesktopPane和JInternalFrame


深度容器、多文档界面、内部窗口


12.4 Swing简化的拖放功能


Swing的部分组件已经提供了默认的拖放支持。


使用setDragEabled(true) 启动拖放支持。


Swing还提供了一种特殊的类:TransferHandler,可以直接将某个组件的指定属性设置成拖放目标,


前提是具有setter()方法。


12.5 Java7新增的Swing功能


12.5.1 使用Layer装饰组件


12.5.2 创建透明、不规则形状窗口


12.6 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条


12.6.1 创建进度条


12.6.2 创建进度对话框


12.7 使用JSlider和BoundedRangeModel创建滑动条


12.8 使用JSpinner和SpinnerModel 创建微调控制器


12.9 使用JList、JComboBox创建列表框


12.9.1简单列表框


12.9.2 不强制存储列表项的ListModel和ComboBoxModel


12.9.3 强制存储列表项的DefaultListModel和DefaultComboBoxModel


12.9.4 使用ListCellRenderer改变列表项外观


12.10 使用JTree和TreeModel创建树


12.11 使用JTable和TableModel创建表格


12.12 使用JFormattedTextField和JTextPane创建格式文本


相关文章
|
10天前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
73 5
|
16天前
|
JavaScript 前端开发 Java
Java 编程进阶实操中工具集整合组件封装方法与使用指南详解
本文详细介绍Hutool工具集和图书管理系统相关组件的封装方法及使用示例。通过通用工具类封装(如日期格式化、字符串处理、加密等)、数据库操作封装(结合Hutool DbUtil与MyBatis)、前端Vue组件封装(图书列表与借阅表单)以及后端服务层封装(业务逻辑实现与REST API设计),帮助开发者提升代码复用性与可维护性。同时,提供最佳实践建议,如单一职责原则、高内聚低耦合、参数配置化等,助力高效开发。适用于Java编程进阶学习与实际项目应用。
84 10
|
10天前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
58 2
|
16天前
|
前端开发 Java 数据库连接
Java 编程进阶实操之工具集整合应用指南
本文聚焦Java编程进阶实操,涵盖并发编程、性能优化及数据库操作优化等核心知识点,并结合Hutool、Postman、Git等实用工具,提供从理论到实践的学习路径。通过小型图书管理系统实战项目,详细解析技术选型与实现步骤,助力开发者掌握Spring Boot、MyBatis等框架应用。同时展望Java新特性与技术趋势,为职业发展奠定基础。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
50 1
|
25天前
|
Java 开发者
Java编程实用技巧:提升代码质量与开发效率
Java作为一门成熟且广泛应用的编程语言,掌握一些实用技巧可以显著提高开发效率和代码质量。以下是值得Java开发者掌握的实用技巧:
42 6
|
10天前
|
人工智能 Java API
Java并发编程之Future与FutureTask
本文深入解析了Future接口及其实现类FutureTask的原理与使用。Future接口定义了获取任务结果、取消任务及查询任务状态的规范,而FutureTask作为其核心实现类,结合了Runnable与Future的功能。文章通过分析FutureTask的成员变量、状态流转、关键方法(如run、set、get、cancel等)的源码,展示了异步任务的执行与结果处理机制。最后,通过示例代码演示了FutureTask的简单用法,帮助读者更直观地理解其工作原理。适合希望深入了解Java异步编程机制的开发者阅读。
|
27天前
|
网络协议 Java 大数据
【高薪程序员必看】万字长文拆解Java并发编程!(1)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
45 0
Java初级笔记-第五章
第五章 面向对象的特点 5.1 继承 面向对象的重要特点之一就是继承。类的继承使得能够在已有的类的基础上构造新的类,新类除了具有被继承类的属性和方法外,还可以根据需要添加新的属性和方法。
1084 0
|
Java Windows 开发框架
Java初级笔记-第一章
第一章 Java概览 1.1 基本简介 Java是一种理想的面向对象的网络编程语言。 1991年,出现了Oak语言,旨在解决编程语言的选择和跨平台的问题。
1410 0
Java初级笔记-第二章
第二章 Java的基本数据类型、运算符及表达式 2.1 标识符 标识符是程序员对程序中的各个元素加以命名时使用的命名记号。
1242 0