百度收录最快的网站,专业从事成都网站建设,网站做排名2015新年,wordpress 重装教程视频教程前言
在前两篇文章中我们已经完成了界面的基础设计和布局#xff0c;并实现了创建文件和文件夹的功能。那么本次我们将聚焦于实现通过鼠标点击的方式打开文件和文件夹的功能。 文章目录前言一、核心目标与技术栈1. 核心目标2. 技术栈二、关键技术1、获取事件源和instanceof关…前言在前两篇文章中我们已经完成了界面的基础设计和布局并实现了创建文件和文件夹的功能。那么本次我们将聚焦于实现通过鼠标点击的方式打开文件和文件夹的功能。文章目录前言一、核心目标与技术栈1. 核心目标2. 技术栈二、关键技术1、获取事件源和instanceof关键字2、打开文件3、关闭窗体三、核心步骤拆解1. 前期准备组件数据绑定2. 主界面类FileSystemUI 实现1核心属性定义2界面初始化方法 initUI()3构造方法FileSystemUI()4程序入口3. 监听器类FileListener 实现1绑定界面对象2处理按钮点击事件actionPerformed()3处理鼠标事件mousePressed()四、完整代码1 主界面类FileSystemUI负责展示界面和目录2 监听器类FileListener负责处理鼠标和菜单动作3. 运行效果五、版本规划六、总结一、核心目标与技术栈1. 核心目标点击文件夹按钮自动刷新界面显示该文件夹下的所有内容双击文件标签调用电脑本地程序打开文件保留V2.0的右键创建文件/文件夹功能2. 技术栈IO 操作java.io.File类文件 / 文件夹的遍历、路径获取事件处理MouseListener鼠标双击、右键事件、ActionListener按钮、菜单点击事件GUI 组件JFrame窗体、JButton文件夹按钮、JLabel文件标签、JPopupMenu右键菜单系统交互java.awt.Desktop类调用本地程序打开文件二、关键技术1、获取事件源和instanceof关键字在实现打开文件和文件夹时我们必须确认鼠标点击的组件是什么才能做出对应的操作这时我们就需要用到方法e.getSource()。这个方法可以帮助我们获取事件源即触发事件的对象。instanceof 是 Java 中的一个二元操作符用于判断一个对象是否是某个类的实例或者是否实现了某个接口。我们用instanceof关键字来判断其是否是某个类的实例从而执行对应的代码。// 获取点击的组件Objectsourcee.getSource();if(sourceinstanceofJButton){// 处理按钮点击}elseif(sourceinstanceofJLabel){// 处理标签双击}2、打开文件使用java.awt.Desktop类实现跨平台的文件打开功能核心代码如下FiletargetFilenewFile(filePath);Desktop.getDesktop().open(targetFile);该方法会自动调用系统默认程序比如TXT 文件→记事本PNG 图片→系统看图软件DOC 文档→Word3、关闭窗体在该版本中创建文件或文件夹后直接将旧的窗体关闭而不是将其设置为不可见方法是JFrame类的对象中的方法dispose()。三、核心步骤拆解1. 前期准备组件数据绑定要实现 “点击按钮跳转目录” 和 “双击标签打开文件”关键是给组件绑定绝对路径文件夹按钮通过setActionCommand()方法绑定文件夹绝对路径点击时通过e.getActionCommand()获取文件标签通过setToolTipText()方法绑定文件绝对路径双击时通过标签对象直接获取2. 主界面类FileSystemUI 实现1核心属性定义// 窗口对象JFramejf;StringdirD:\\;// 监听器对象FileListener1flnewFileListener1();2界面初始化方法initUI()该方法是界面的核心完成窗体配置、目录遍历、组件创建三大功能窗体基础配置设置标题、大小、居中显示使用流式布局让组件排列整齐目录遍历跳过隐藏文件只展示可见内容文件夹→橙色JButton绑定绝对路径到ActionCommand添加ActionListenerif(f.isDirectory()){JButtonbtnnewJButton(f.getName());//设置的按钮上直接显示文本btn.setActionCommand(f.getAbsolutePath());// 设置为绝对路径btn.setPreferredSize(dim);btn.setBackground(Color.ORANGE);// 给按钮添加点击监听器btn.addActionListener(fl);jf.add(btn);btn.setToolTipText(f.getName());// 显示不全的提示文本}文件→灰色JLabel绑定绝对路径到ToolTipText添加MouseListenerelseif(f.isFile()){JLabeljlanewJLabel(f.getName());// tooltip显示文件绝对路径jla.setToolTipText(f.getAbsolutePath());jla.setPreferredSize(dim);jla.setOpaque(true);jla.setBackground(Color.LIGHT_GRAY);// 给文件标签添加鼠标监听器jla.addMouseListener(fl);jf.add(jla);}监听器绑定将窗体对象传给监听器让监听器能操作界面3构造方法FileSystemUI()创建对象时直接初始化界面默认加载D盘根目录publicFileSystemUI(){initUI(dir);}4程序入口通过main方法创建FileSystemUI对象启动程序。3. 监听器类FileListener 实现该类是 V3.0 的功能核心继承MouseAdapter并实现ActionListener处理所有交互事件。1绑定界面对象定义FileSystemUI类型属性提供setFileUI()方法让监听器能操作窗体和刷新界面。2处理按钮点击事件actionPerformed()判断事件源通过instanceof区分是文件夹按钮还是菜单项文件夹按钮逻辑获取绑定的绝对路径→关闭当前窗体→调用initUI()加载新目录菜单项逻辑保留 V2.0 的创建文件、文件夹、刷新功能创建后刷新界面3处理鼠标事件mousePressed()双击文件标签逻辑判断事件源是JLabel 左键双击→获取标签的ToolTipText文件路径→通过Desktop.getDesktop().open()调用本地程序打开右键弹出菜单逻辑保留 V2.0 功能在窗体空白处右键弹出菜单四、完整代码1 主界面类FileSystemUI负责展示界面和目录importjavax.swing.*;importjava.awt.*;importjava.io.File;publicclassFileSystemUI{// 窗口对象JFramejf;StringdirD:\\Test\\;// 监听器对象FileListenerflnewFileListener();// 构造方法创建对象时直接初始化界面默认加载D盘根目录publicFileSystemUI(){initUI(dir);}// 界面初始化方法加载对应目录的文件publicvoidinitUI(Stringpath){// 创建窗口设置标题显示当前目录路径、大小、居中jfnewJFrame(文件管理系统path);jf.setSize(700,600);jf.setLayout(newFlowLayout(FlowLayout.LEFT,10,20));// 左对齐组件间距20jf.setLocationRelativeTo(null);// 窗口在屏幕居中显示// 关闭窗口时终止应用程序jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 读取指定路径下的所有文件和文件夹FilefilenewFile(path);File[]filesfile.listFiles();// 设置组件大小文件夹按钮和文件标签统一大小DimensiondimnewDimension(80,50);// 遍历所有文件/文件夹分别显示为按钮或标签if(files!null){for(Filef:files){// 跳过隐藏文件if(f.isHidden())continue;// 如果是文件夹显示为橙色按钮if(f.isDirectory()){JButtonbtnnewJButton(f.getName());//设置的按钮上直接显示文本btn.setActionCommand(f.getAbsolutePath());// 设置为绝对路径btn.setPreferredSize(dim);btn.setBackground(Color.ORANGE);// 给按钮添加点击监听器btn.addActionListener(fl);jf.add(btn);btn.setToolTipText(f.getName());// 显示不全的提示文本}// 如果是文件显示为灰色标签elseif(f.isFile()){JLabeljlanewJLabel(f.getName());// tooltip显示文件绝对路径jla.setToolTipText(f.getAbsolutePath());jla.setPreferredSize(dim);jla.setOpaque(true);jla.setBackground(Color.LIGHT_GRAY);// 给文件标签添加鼠标监听器jla.addMouseListener(fl);jf.add(jla);}}}// 给窗口添加右键菜单监听器jf.addMouseListener(fl);// 关键把当前界面对象传给监听器让监听器能操作窗口fl.setFileSystemUI(this);// 窗口显示jf.setVisible(true);}// 程序入口运行就启动文件管理器publicstaticvoidmain(String[]args){newFileSystemUI();}}2 监听器类FileListener负责处理鼠标和菜单动作importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.io.File;importjava.io.IOException;publicclassFileListenerextendsMouseAdapterimplementsActionListener,MouseListener{// 关联界面类操作窗口FileSystemUIfileSystemUI;// 给监听器设置界面对象publicvoidsetFileSystemUI(FileSystemUIfileSystemUI){this.fileSystemUIfileSystemUI;}// 处理按钮/菜单点击事件OverridepublicvoidactionPerformed(ActionEvente){// 获取点击的组件Objectsourcee.getSource();// 如果点击的是文件夹按钮if(sourceinstanceofJButton){System.out.println(点击了文件夹按钮);// 获取按钮绑定的绝对路径Stringpathe.getActionCommand();// 关闭当前窗口重新初始化界面显示目标文件夹内容fileSystemUI.jf.dispose();fileSystemUI.initUI(path);}// 保留V2.0的右键菜单逻辑创建文件/文件夹、刷新elseif(sourceinstanceofJMenuItem){Stringmenue.getActionCommand();// 刷新功能关闭当前窗口重新加载当前路径if(menu.equals(刷新)){StringpathfileSystemUI.jf.getTitle().replace(文件管理系统,);fileSystemUI.jf.dispose();fileSystemUI.initUI(path);}// 创建文件/文件夹elseif(menu.equals(新建文件)){StringpathfileSystemUI.jf.getTitle().replace(文件管理系统,);StringfileNameJOptionPane.showInputDialog(请输入文件名);if(fileName!null!fileName.isEmpty()){FilenewFilenewFile(path\\fileName);try{if(newFile.createNewFile()){JOptionPane.showMessageDialog(null,文件创建成功);// 刷新界面显示新文件fileSystemUI.jf.dispose();fileSystemUI.initUI(path);}else{JOptionPane.showMessageDialog(null,文件已存在);}}catch(IOExceptionex){thrownewRuntimeException(ex);}}}elseif(menu.equals(新建文件夹)){StringpathfileSystemUI.jf.getTitle().replace(文件管理系统,);StringdirNameJOptionPane.showInputDialog(请输入文件夹名);if(dirName!null!dirName.isEmpty()){FilenewDirnewFile(path\\dirName);if(newDir.mkdirs()){JOptionPane.showMessageDialog(null,文件夹创建成功);// 刷新界面显示新文件夹fileSystemUI.jf.dispose();fileSystemUI.initUI(path);}else{JOptionPane.showMessageDialog(null,文件夹已存在);}}}}}// 处理鼠标点击事件OverridepublicvoidmousePressed(MouseEvente){// 获取点击的组件Objectsourcee.getSource();// 只处理鼠标左键点击if(e.getButton()1){// 如果点击的是文件标签且是双击if(sourceinstanceofJLabele.getClickCount()2){System.out.println(双击了文件标签);JLabelfileLabel(JLabel)source;// 获取标签绑定的文件绝对路径StringfilePathfileLabel.getToolTipText();FiletargetFilenewFile(filePath);// 调用电脑本地程序打开文件try{Desktop.getDesktop().open(targetFile);}catch(IOExceptionex){JOptionPane.showMessageDialog(null,文件打开失败ex.getMessage());}}}// 保留V2.0的右键菜单逻辑窗口空白处右键弹出菜单elseif(sourceinstanceofJFramee.getButton()3){JPopupMenupopupMenunewJPopupMenu();String[]menuStrs{新建文件,新建文件夹,刷新};for(StringmenuStr:menuStrs){JMenuItemmenunewJMenuItem(menuStr);// 给菜单项添加点击监听器menu.addActionListener(this);// 把菜单项添加到右键菜单popupMenu.add(menu);}// 显示右键菜单popupMenu.show(e.getComponent(),e.getX(),e.getY());}}}3. 运行效果初始界面启动程序后自动加载 D 盘根目录内容橙色按钮文件夹灰色标签文件窗体标题显示当前目录路径打开文件夹点击任意橙色文件夹按钮界面会自动刷新并显示该文件夹内的所有文件和子文件夹标题同步更新为当前文件夹路径。文件打开双击任意灰色文件标签系统会调用默认程序打开该文件双击test.txt→记事本打开双击photo.png→系统看图软件打开双击document.docx→Word 打开右键菜单操作在窗体空白处右键弹出菜单选择 “创建文件” 或 “创建文件夹”输入名称后程序自动在当前目录创建对应文件 / 文件夹界面自动刷新显示新创建的内容选择 “刷新” 可手动更新当前目录内容五、版本规划V1.0已实现显示本地目录结构文件→标签、目录→按钮V2.0已实现新增创建文件、创建文件夹功能V3.0已实现支持点击按钮打开文件夹、点击标签打开文件V4.0新增文件搜索功能六、总结V3.0 版本通过ActionCommand和ToolTipText实现组件与路径的绑定结合监听器完成了 “文件夹打开” 和 “文件打开” 两大核心功能。同时保留了 V2.0 的右键操作形成了一个功能完整、交互流畅的基础文件管理器。