第 19章
文本编辑器
– 产品生命周期
– Swing入门
– 事件处理
– 文字编辑与储存
– ExecutableJar的制作分析( Analysis)
具备窗口接口分析( Analysis)
分析( Analysis)
分析( Analysis)
档案的开启与储存
– 开启旧档
– 储存档案
– 另存新檔
离开应用程序
编辑文字
– 剪下
– 复制
– 贴上设计( Design)
开始为应用程序规划蓝图
根据需求将应用程序切割出许多模块
设计出需求中所发掘出来的对象
为这些对象设计出交互行为,以完成应用程序所必须达成的功能
还不会考虑到该使用何种语言与技术开发( Development)
决定使用何种语言及技术来开发应用程序
– 运用 JavaSE技术来开发文本编辑器
– 使用 Swing窗口组件来开发测试( Testing)
将完成的应用程序进行测试
– 验收其是否完成所期许的需求
– 程序中是否存在臭虫( Bug)
– 效能方面等的问题完成( Implementation)
交付程序给客户
产品上线
交给教授打分数 XD
维护( Maintenance)
程序臭虫
需求改变
需求增加
效能、安全问题
…
结束生命周期 ( End-of-life,EOL)
产品不再符合使用的效益
版本更迭而造成应用程序不再适合
Swing简介
Component继承体系
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
java.awt.Window
java.awt.Dialog
java.awt.Frame
java.awt.Button
java.awt.Checkbox
java.awt.Label
java.awt.List
java.awt.TextComponent
java.awt.MenuComponent
java.awt.MenuBar
java.awt.MennItem
java.awt.Menu
Swing简介
Swing继承体系
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPanel
javax.swing.JTextComponent
java.awt.Window
javax.swing.JWindow
java.awt.Dialog
javax.swing.JDialog
java.awt.Frame
javax.swing.JFrame
设计主窗口与选单列
import javax.swing.JFrame;
public class JNotePadUI extends JFrame {
public JNotePadUI() {
super("新增文本文件 ");
setUpUIComponent();
setUpEventListener();
setVisible(true);
}
private void setUpUIComponent() {
setSize(640,480);
}
private void setUpEventListener() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JNotePadUI();
}
}
设计主窗口与选单列设计主窗口与选单列
选单列
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JMenuBar
javax.swing.AbstractButton
javax.swing.JMenuItem
javax.swing.JMenu
设计主窗口与选单列
建立选单列、选单与选单项目
//选单列
JMenuBar menuBar = new JMenuBar()
//选单 ;
JMenu fileMenu = new JMenu("檔案 ");
//选单项目
JMenuItem menuOpen = new JMenuItem("开启旧档 ");
//在 JMenu中加入 JMenuItem
fileMenu.add(menuOpen)
//将 JMenu加入 JMenuBar;
menuBar.add(fileMenu);
//使用 JFrame的 setMenuBar设置选单列
setMenuBar(menuBar);
设计主窗口与选单列
快捷键的设置
加入分隔线
menuOpen.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
fileMenu.addSeparator();
设计主窗口与选单列版面管理
在 Container中的组件的位置跟大小是由版面管理员 ( Layoutmanager)来决定
当 Container需要决定它当中的组件的大小或位置时,就会呼叫版面管理员来为其执行版面管理
结合 JTextArea,JScrollPane以建立文字编辑区域
JTextArea textArea = new JTextArea();
textArea.setFont(new Font("细明体 ",Font.PLAIN,16));
textArea.setLineWrap(true);
JScrollPane panel = new JScrollPane(textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
版面管理
Swing窗口包括了几个层次
– RootPane
– LayoutPane
– ContentPane
– MenuBar
– GlassPane
最深层的是 RootPane,最上层的是
GlassPane
版面管理
在 JFrame中要取得 ContentPane,可以使用继承下来的 getContentPane()方法
Container contentPane = getContentPane();
contentPane.add(panel,BorderLayout.CENTER);
版面管理
制作 JLabel并加入至 ContentPane中
//状态栏
JLabel stateBar = new JLabel("未修改 ");
stateBar.setHorizontalAlignment(SwingConstants.LEFT);
stateBar.setBorder(
BorderFactory.createEtchedBorder());
contentPane.add(stateBar,BorderLayout.SOUTH);
版面管理
Java事件模型
委托事件模型( Delegation eventmodel)
组件会将事件传播至每一个事件倾听者
( Eventlistener)
事件倾听者中定义了与不同事件相对应的事件处理者 ( Eventhandler)
事件发生时是委托事件处理者进行处理,
事件处理者与组件的设计可以分别独立
Java事件模型
事件倾听者都实作了 java.util.EventListener
界面
– 标示接口( Markerinterface)
相应的事件倾听者主要位于 java.awt.event
与 javax.swing.event套件之下
– EventListener的子界面文本编辑器的事件处理
选单项目被按下时的事件处理
//开启旧文件选单项目的事件处理
menuOpen.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
openFile();
}
}
);
文本编辑器的事件处理
JTextArea的事件方面
也可以继承 java.awt.event.KeyAdapter
package java.awt.event;
public interface KeyListener {
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
public void keyTyped(KeyEvent e)
}
文本编辑器的事件处理
使用 JTextArea的 addKeyListener()方法加入事件倾听者
//编辑区键盘事件
textArea.addKeyListener(
new KeyAdapter() {
public void keyTyped(KeyEvent e) {
processTextArea();
}
}
);
文本编辑器的事件处理
鼠标事件倾听者是实作
java.awt.event.MouseListener界面
可以继承 java.awt.event.MouseAdapter
//编辑区鼠标事件
textArea.addMouseListener(
new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3)
popUpMenu.show(editMenu,e.getX(),e.getY());
}
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1)
popUpMenu.setVisible(false);
}
}
);
文本编辑器的事件处理
popUpMenu参考至
javax.swing.JPopupMenu的实例
按下窗口右上角的 X按钮
JPopupMenu popUpMenu = editMenu.getPopupMenu();
//按下窗口关闭钮事件处理
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeFile();
}
}
);
文本编辑器的事件处理开启档案的流程处理
private void openFile() {
if(isCurrentFileSaved()) { //文件是否为储存状态
open(); //开启旧档
}
else {
//显示对话框
int option = JOptionPane.showConfirmDialog(
null,"档案已修改,是否储存? ",
"储存档案? ",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,null);
switch(option) {
//确认档案储存
case JOptionPane.YES_OPTION:
saveFile(); //储存档案
break;
//放弃档案储存
case JOptionPane.NO_OPTION:
open();
break;
}
}
}
开启档案的流程处理
在判断档案是否储存的方法上,主要是根据状态栏来进行判断
private boolean isCurrentFileSaved() {
if(stateBar.getText().equals("未修改 ")) {
return false;
}
else {
return true;
}
}
开启档案的流程处理
开启档案时则是使用
javax.swing.JFileChooser来显示档案选取的对话框
private void open() {
// fileChooser是 JFileChooser的实例
//显示档案选取的对话框
int option = fileChooser.showDialog(null,null);
//使用者按下确认键
if(option == JFileChooser.APPROVE_OPTION) {
try {
//开启选取的档案
BufferedReader buf =
new BufferedReader(
new FileReader(
fileChooser.getSelectedFile()));
开启档案的流程处理
//设定状态栏
stateBar.setText("未修改 ");
//取得系统相依的换行字符
String lineSeparator = System.getProperty("line.separator");
//读取档案并附加至文字编辑区
String text;
while((text = buf.readLine()) != null) {
textArea.append(text);
textArea.append(lineSeparator);
}
buf.close();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"开启档案失败 ",JOptionPane.ERROR_MESSAGE);
}
}
}
开启档案的流程处理储存档案的流程处理
private void saveFile() {
//从标题栏取得文件名
File file = new File(getTitle());
//若指定的档案不存在
if(!file.exists()) {
//执行另存新档
saveFileAs();
}
else {
try {
//开启指定的档案
BufferedWriter buf =
new BufferedWriter(
new FileWriter(file));
//将文字编辑区的文字写入档案
buf.write(textArea.getText());
buf.close();
//设定状态栏为未修改
stateBar.setText("未修改 ");
}
储存档案的流程处理
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"写入档案失败 ",JOptionPane.ERROR_MESSAGE);
}
}
}
private void saveFileAs() {
//显示档案对话框
int option = fileChooser.showDialog(null,null);
//如果确认选取档案
if(option == JFileChooser.APPROVE_OPTION) {
//取得选择的档案
File file = fileChooser.getSelectedFile();
//在标题栏上设定文件名
setTitle(file.toString());
try {
//建立档案
file.createNewFile();
//进行档案储存
saveFile();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"无法建立新档 ",JOptionPane.ERROR_MESSAGE);
}
}
}
储存档案的流程处理关闭档案的流程处理
private void closeFile() {
//是否已储存文件
if(isCurrentFileSaved()) {
//释放窗口资源,而后关闭程序
dispose();
}
else {
int option = JOptionPane.showConfirmDialog(
null,"档案已修改,是否储存? ",
"储存档案? ",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,null);
switch(option) {
case JOptionPane.YES_OPTION:
saveFile();
break;
case JOptionPane.NO_OPTION:
dispose();
}
}
}
文字区的编辑、剪下、复制、贴上
private void cut() {
textArea.cut();
stateBar.setText("已修改 ");
popUpMenu.setVisible(false);
}
private void copy() {
textArea.copy();
popUpMenu.setVisible(false);
}
private void paste() {
textArea.paste();
stateBar.setText("已修改 ");
popUpMenu.setVisible(false);
}
文字区的编辑、剪下、复制、贴上
ExecutableJar的制作
ExecutableJar的制作
ExecutableJar的制作
ExecutableJar的制作
文本编辑器
– 产品生命周期
– Swing入门
– 事件处理
– 文字编辑与储存
– ExecutableJar的制作分析( Analysis)
具备窗口接口分析( Analysis)
分析( Analysis)
分析( Analysis)
档案的开启与储存
– 开启旧档
– 储存档案
– 另存新檔
离开应用程序
编辑文字
– 剪下
– 复制
– 贴上设计( Design)
开始为应用程序规划蓝图
根据需求将应用程序切割出许多模块
设计出需求中所发掘出来的对象
为这些对象设计出交互行为,以完成应用程序所必须达成的功能
还不会考虑到该使用何种语言与技术开发( Development)
决定使用何种语言及技术来开发应用程序
– 运用 JavaSE技术来开发文本编辑器
– 使用 Swing窗口组件来开发测试( Testing)
将完成的应用程序进行测试
– 验收其是否完成所期许的需求
– 程序中是否存在臭虫( Bug)
– 效能方面等的问题完成( Implementation)
交付程序给客户
产品上线
交给教授打分数 XD
维护( Maintenance)
程序臭虫
需求改变
需求增加
效能、安全问题
…
结束生命周期 ( End-of-life,EOL)
产品不再符合使用的效益
版本更迭而造成应用程序不再适合
Swing简介
Component继承体系
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
java.awt.Window
java.awt.Dialog
java.awt.Frame
java.awt.Button
java.awt.Checkbox
java.awt.Label
java.awt.List
java.awt.TextComponent
java.awt.MenuComponent
java.awt.MenuBar
java.awt.MennItem
java.awt.Menu
Swing简介
Swing继承体系
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPanel
javax.swing.JTextComponent
java.awt.Window
javax.swing.JWindow
java.awt.Dialog
javax.swing.JDialog
java.awt.Frame
javax.swing.JFrame
设计主窗口与选单列
import javax.swing.JFrame;
public class JNotePadUI extends JFrame {
public JNotePadUI() {
super("新增文本文件 ");
setUpUIComponent();
setUpEventListener();
setVisible(true);
}
private void setUpUIComponent() {
setSize(640,480);
}
private void setUpEventListener() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JNotePadUI();
}
}
设计主窗口与选单列设计主窗口与选单列
选单列
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JMenuBar
javax.swing.AbstractButton
javax.swing.JMenuItem
javax.swing.JMenu
设计主窗口与选单列
建立选单列、选单与选单项目
//选单列
JMenuBar menuBar = new JMenuBar()
//选单 ;
JMenu fileMenu = new JMenu("檔案 ");
//选单项目
JMenuItem menuOpen = new JMenuItem("开启旧档 ");
//在 JMenu中加入 JMenuItem
fileMenu.add(menuOpen)
//将 JMenu加入 JMenuBar;
menuBar.add(fileMenu);
//使用 JFrame的 setMenuBar设置选单列
setMenuBar(menuBar);
设计主窗口与选单列
快捷键的设置
加入分隔线
menuOpen.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
fileMenu.addSeparator();
设计主窗口与选单列版面管理
在 Container中的组件的位置跟大小是由版面管理员 ( Layoutmanager)来决定
当 Container需要决定它当中的组件的大小或位置时,就会呼叫版面管理员来为其执行版面管理
结合 JTextArea,JScrollPane以建立文字编辑区域
JTextArea textArea = new JTextArea();
textArea.setFont(new Font("细明体 ",Font.PLAIN,16));
textArea.setLineWrap(true);
JScrollPane panel = new JScrollPane(textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
版面管理
Swing窗口包括了几个层次
– RootPane
– LayoutPane
– ContentPane
– MenuBar
– GlassPane
最深层的是 RootPane,最上层的是
GlassPane
版面管理
在 JFrame中要取得 ContentPane,可以使用继承下来的 getContentPane()方法
Container contentPane = getContentPane();
contentPane.add(panel,BorderLayout.CENTER);
版面管理
制作 JLabel并加入至 ContentPane中
//状态栏
JLabel stateBar = new JLabel("未修改 ");
stateBar.setHorizontalAlignment(SwingConstants.LEFT);
stateBar.setBorder(
BorderFactory.createEtchedBorder());
contentPane.add(stateBar,BorderLayout.SOUTH);
版面管理
Java事件模型
委托事件模型( Delegation eventmodel)
组件会将事件传播至每一个事件倾听者
( Eventlistener)
事件倾听者中定义了与不同事件相对应的事件处理者 ( Eventhandler)
事件发生时是委托事件处理者进行处理,
事件处理者与组件的设计可以分别独立
Java事件模型
事件倾听者都实作了 java.util.EventListener
界面
– 标示接口( Markerinterface)
相应的事件倾听者主要位于 java.awt.event
与 javax.swing.event套件之下
– EventListener的子界面文本编辑器的事件处理
选单项目被按下时的事件处理
//开启旧文件选单项目的事件处理
menuOpen.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
openFile();
}
}
);
文本编辑器的事件处理
JTextArea的事件方面
也可以继承 java.awt.event.KeyAdapter
package java.awt.event;
public interface KeyListener {
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
public void keyTyped(KeyEvent e)
}
文本编辑器的事件处理
使用 JTextArea的 addKeyListener()方法加入事件倾听者
//编辑区键盘事件
textArea.addKeyListener(
new KeyAdapter() {
public void keyTyped(KeyEvent e) {
processTextArea();
}
}
);
文本编辑器的事件处理
鼠标事件倾听者是实作
java.awt.event.MouseListener界面
可以继承 java.awt.event.MouseAdapter
//编辑区鼠标事件
textArea.addMouseListener(
new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3)
popUpMenu.show(editMenu,e.getX(),e.getY());
}
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1)
popUpMenu.setVisible(false);
}
}
);
文本编辑器的事件处理
popUpMenu参考至
javax.swing.JPopupMenu的实例
按下窗口右上角的 X按钮
JPopupMenu popUpMenu = editMenu.getPopupMenu();
//按下窗口关闭钮事件处理
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeFile();
}
}
);
文本编辑器的事件处理开启档案的流程处理
private void openFile() {
if(isCurrentFileSaved()) { //文件是否为储存状态
open(); //开启旧档
}
else {
//显示对话框
int option = JOptionPane.showConfirmDialog(
null,"档案已修改,是否储存? ",
"储存档案? ",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,null);
switch(option) {
//确认档案储存
case JOptionPane.YES_OPTION:
saveFile(); //储存档案
break;
//放弃档案储存
case JOptionPane.NO_OPTION:
open();
break;
}
}
}
开启档案的流程处理
在判断档案是否储存的方法上,主要是根据状态栏来进行判断
private boolean isCurrentFileSaved() {
if(stateBar.getText().equals("未修改 ")) {
return false;
}
else {
return true;
}
}
开启档案的流程处理
开启档案时则是使用
javax.swing.JFileChooser来显示档案选取的对话框
private void open() {
// fileChooser是 JFileChooser的实例
//显示档案选取的对话框
int option = fileChooser.showDialog(null,null);
//使用者按下确认键
if(option == JFileChooser.APPROVE_OPTION) {
try {
//开启选取的档案
BufferedReader buf =
new BufferedReader(
new FileReader(
fileChooser.getSelectedFile()));
开启档案的流程处理
//设定状态栏
stateBar.setText("未修改 ");
//取得系统相依的换行字符
String lineSeparator = System.getProperty("line.separator");
//读取档案并附加至文字编辑区
String text;
while((text = buf.readLine()) != null) {
textArea.append(text);
textArea.append(lineSeparator);
}
buf.close();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"开启档案失败 ",JOptionPane.ERROR_MESSAGE);
}
}
}
开启档案的流程处理储存档案的流程处理
private void saveFile() {
//从标题栏取得文件名
File file = new File(getTitle());
//若指定的档案不存在
if(!file.exists()) {
//执行另存新档
saveFileAs();
}
else {
try {
//开启指定的档案
BufferedWriter buf =
new BufferedWriter(
new FileWriter(file));
//将文字编辑区的文字写入档案
buf.write(textArea.getText());
buf.close();
//设定状态栏为未修改
stateBar.setText("未修改 ");
}
储存档案的流程处理
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"写入档案失败 ",JOptionPane.ERROR_MESSAGE);
}
}
}
private void saveFileAs() {
//显示档案对话框
int option = fileChooser.showDialog(null,null);
//如果确认选取档案
if(option == JFileChooser.APPROVE_OPTION) {
//取得选择的档案
File file = fileChooser.getSelectedFile();
//在标题栏上设定文件名
setTitle(file.toString());
try {
//建立档案
file.createNewFile();
//进行档案储存
saveFile();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,e.toString(),
"无法建立新档 ",JOptionPane.ERROR_MESSAGE);
}
}
}
储存档案的流程处理关闭档案的流程处理
private void closeFile() {
//是否已储存文件
if(isCurrentFileSaved()) {
//释放窗口资源,而后关闭程序
dispose();
}
else {
int option = JOptionPane.showConfirmDialog(
null,"档案已修改,是否储存? ",
"储存档案? ",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,null);
switch(option) {
case JOptionPane.YES_OPTION:
saveFile();
break;
case JOptionPane.NO_OPTION:
dispose();
}
}
}
文字区的编辑、剪下、复制、贴上
private void cut() {
textArea.cut();
stateBar.setText("已修改 ");
popUpMenu.setVisible(false);
}
private void copy() {
textArea.copy();
popUpMenu.setVisible(false);
}
private void paste() {
textArea.paste();
stateBar.setText("已修改 ");
popUpMenu.setVisible(false);
}
文字区的编辑、剪下、复制、贴上
ExecutableJar的制作
ExecutableJar的制作
ExecutableJar的制作
ExecutableJar的制作