此文章介绍了关于文件的浏览,打开以及新建功能。
首先创建两个点击监听器功能,一个监听文件及文件夹,一个监听面板。
创建ClickListener类,与动作监听器一样,使用点击监听器接口也需要重写一下里面的各种方法,
第一个重写的是动作监听器里面的方法,当匹配到新建文件时,会创建一个新的文件,当匹配到新建文件夹时,就会创建新建文件夹。
之后重写的都是点击监听器里面的方法,在mouseClick方法中,首先利用e.getSource()获取事件源,在本文章中,事件源只有两类,一个是按钮,一个是面板空白部分,当点击的内容匹配到按钮时,继续判断鼠标的点击次数,如果是两次,则表示点开文件或者文件夹,获取事件源,再获取按钮的指令文本(绝对路径),重新创建一个文件类,继续打开文件及文件夹内容,如果判断三次(注意是e.getButton()== 3,而不是e.getCount()== 3)表示鼠标右击,根据对电脑的使用可以判断出此时应该弹出一个菜单栏,显示一些复制粘贴的内容,这里引用了一些打开删除重命名的功能,添加并且显示菜单栏;如果不是按钮,在空白处右击可以实现创建文件以及文件夹,与上文同理创建。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
public class ClickListener implements MouseListener , ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("新建文件"))
{
String fileName = JOptionPane.showInputDialog(null, "新建文件", JOptionPane.INFORMATION_MESSAGE);
try {
new File(fileName).createNewFile();
}
catch (Exception e1) {
e1.printStackTrace();
}
}else if (cmd.equals("新建文件夹"))
{
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//设置选择文件夹
}
}
@Override
public void mouseClicked(MouseEvent e) {
Object obj = e.getSource();
if (obj instanceof JButton)
{
if (e.getClickCount() == 2)
{
JButton btn = (JButton) e.getSource();//获取事件源,强转按钮类型
String path = btn.getActionCommand();
new FileBrowUI(path);
}
if (e.getButton() == 3)
{
JPopupMenu menu = new JPopupMenu();//弹出菜单
String[] items = {"打开", "删除", "重命名"};
for (int i = 0; i < items.length; i++)
{
JMenuItem item = new JMenuItem(items[i]);//添加菜单项
menu.add(item);
}
menu.show(e.getComponent(), e.getX(), e.getY());//显示菜单
}
}else {
if (e.getButton() == 3)
{
JPopupMenu menu = new JPopupMenu();
String[] items = {"新建文件", "新建文件夹", "刷新"};
for (int i = 0; i < items.length; i++)
{
JMenuItem item = new JMenuItem(items[i]);
menu.add(item);
}
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
创建OpenFileListener类,如果监听到的是文件,那么可以根据文件类型打开任何一个文件,“ksolaunch”表示我这个电脑的WPS软件。
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class OpenFileListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2){
MyFileLabel label = (MyFileLabel)e.getSource();
try{
Runtime.getRuntime().exec(new String[]{"ksolaunch", label.getAbsolutePath()});
}
catch(Exception ex)
{
throw new RuntimeException(ex);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
创建一个MyFileLabel类,因为需要获得文件的绝对路径,但是JLabel中没有此功能,所以要创建一个类继承一下JLabel,便于对路径的更改与使用。
public class MyFileLabel extends JLabel {
String absolutePath;
public String getAbsolutePath() {
return absolutePath;
}
public void setAbsolutePath(String absolutePath) {
this.absolutePath = absolutePath;
}
public MyFileLabel(String name) {
super(name);
}
}
创建一个FileBrowUI类,在这里实现程序的面板,按钮,文本框设计,对于路径root,两个监听器都是静态的原因是要在重新创建浏览文件对象的时候就会启动;在FileBrowUI()方法中,设置标题,设置文本框,设置开头,创建文件夹以及文件显示的面板;在listFiles()方法中,获取文件以及文件夹的路径,将他们存放到files数组中,再创建一个JComponent数组用于存放JAVA中的组件(包括按钮,面板等),如果判断是文件夹,那么就创建文件夹,设置文件夹按钮的大小,颜色,将此按钮添加一个打开文件夹的点击监听器;如果是文件,那么就设置文件标签,设置大小,颜色,添加一个打开文件的点击监听器,最后将这些组件全部返回到FileBrowUI中,最终全部添加到文件面板中,对文件面板添加一个监听器,最后显示所有组件。
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class FileBrowUI extends JFrame {
static String root = "E://";
static ClickListener clickListener = new ClickListener();
static OpenFileListener openFileListener = new OpenFileListener();
public FileBrowUI(String path) {
this.setSize(1000, 600);
this.setTitle("文件浏览器 路径:" + path);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel pathPanel = new JPanel();
JLabel pathJla = new JLabel("当前路径:");
JTextField pathJtf = new JTextField(path, 50);
JTextField searchJtf = new JTextField("搜索", 16);
JButton searchBtn = new JButton("搜索");
JButton pathBtn = new JButton("转到");
pathPanel.add(pathJla);
pathPanel.add(pathJtf);
pathPanel.add(searchJtf);
pathPanel.add(searchBtn);
pathPanel.add(pathBtn);
//创建文件夹以及文件显示区域面板
JPanel filePanel = new JPanel();
filePanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
JComponent[] components = listFiles(path);
for (int i = 0;i < components.length;i++)
{
filePanel.add(components[i]);
}
filePanel.addMouseListener(clickListener);
//设置路径面板和文件面板的背景色
pathPanel.setBackground(Color.white);
filePanel.setBackground(Color.lightGray);
//添加路径面板和文件面板到窗体 一个北面一个中间
this.add(pathPanel, BorderLayout.NORTH);
this.add(filePanel, BorderLayout.CENTER);
this.setVisible(true);
}
public JComponent[] listFiles(String path)
{
File rootFile = new File(path);
File[] files = rootFile.listFiles();
JComponent[] jComponents = new JComponent[files.length];
Dimension dim = new Dimension(100, 35);
for (int i = 0; i < files.length; i++)
{
File file = files[i];
if (file.isDirectory())//如果是文件夹
{
JButton btn = new JButton(file.getName());
btn.setBackground(new Color(138,106,24));
btn.setActionCommand(file.getAbsolutePath());
btn.setToolTipText(file.getName());
jComponents[i] = btn;
btn.setPreferredSize(dim);
btn.addMouseListener(clickListener);
}else {
MyFileLabel label = new MyFileLabel(file.getName());
label.setToolTipText(file.getName());
label.setAbsolutePath(file.getAbsolutePath());
label.setOpaque(true);
label.setBackground(Color.white);
jComponents[i] = label;
label.setPreferredSize(dim);
label.addMouseListener(openFileListener);
}
}
return jComponents;
}
public static void main(String[] args) {
new FileBrowUI(root);
}
}