夹娃展示目录结构
程序员文章站
2022-05-02 12:27:00
...
夹娃展示目录结构
最后是酱紫
夹娃代码
其实网上都有,拿下来改两下就能用,肯定有人会问我为嘛不用jtree,俩原因,一是最开始是想做成log的样子而不是权限树,可以剪切出来处理,还是蛮方便的,所以是使用的JTextArea,换成JTextPane则是因为想着加个图标,后面没找到合适的小图标,大图标布局太*了,二是jtree没有内部逻辑,扩展起来挺麻烦,而JTextPane自己写了内部逻辑,改成jtable更容易 代码片
.
package wendangguanli;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class PathTree extends JPanel {
private static final long serialVersionUID = 1L;
private JButton stopButton = new JButton("停止扫描");
private JButton browseButton = new JButton("选择文件夹");
private JTextPane pathsTextArea = new JTextPane();
// private JCheckBox showHiddenFilesCheckbox = new JCheckBox("显示隐藏文件", false);
public PathTree(String dir) {
initGui(dir);
}
// 初始化界面
private void initGui(String dir) {
this.setLayout(new BorderLayout());
JPanel buttonsPanel = new JPanel();
buttonsPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY));
// buttonsPanel.add(showHiddenFilesCheckbox);
buttonsPanel.add(browseButton);
buttonsPanel.add(stopButton);
this.add(buttonsPanel, BorderLayout.NORTH);
JScrollPane scroller = new JScrollPane(pathsTextArea);
scroller.setBorder(null);
this.add(scroller, BorderLayout.CENTER);
JFileChooser chooser = getChooser(dir);
FactTree ft = new FactTree(chooser, pathsTextArea);
Thread t = new Thread(ft);
t.start();
browseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int result = chooser.showOpenDialog(PathTree.this);
if (result == JFileChooser.APPROVE_OPTION) {
Thread t = new Thread(ft);
t.start();
}
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ft.setStopped(true);
}
});
}
private JFileChooser getChooser(String dir) {
// 选择文件夹
String d;
if (dir == null) {
d = ".";
} else {
dir = dir.trim();
if (dir.equals("")) {
d = ""; // 我的文档
} else {
File f = new File(dir);
if (!f.exists()) {
d = ".";
} else {
d = dir;
}
}
}
JFileChooser chooser = new JFileChooser(d);
System.out.println("d:" + d);
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setSelectedFile(new File(d));
return chooser;
}
// 创建主窗口
private static void createGUIAndShow(String dir) {
JFrame frame = new JFrame("目录结构树");
frame.setContentPane(new PathTree(dir));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
int w = 600;
int h = 700;
int x = (ss.width - w) / 2;
int y = (ss.height - h) / 2 - 40;
x = x > 0 ? x : 0;
y = y > 0 ? y : 0;
frame.setBounds(x, y, w, h);
frame.setVisible(true);
}
public static void main(String[] args) {
System.out.println("args.length:" + args.length);
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
// UIManager.setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String dir = null;
if (args.length > 0)
dir = args[0];
System.out.println("dir:" + dir);
createGUIAndShow(dir);
// createGUIAndShow("c:");
}
});
}
}
class FactTree implements Runnable {
private JFileChooser chooser;
private JTextPane pathsTextArea;
private SimpleAttributeSet attrset = new SimpleAttributeSet();
private boolean stopped;
private Map<Integer, String> pathIndexes = new HashMap<Integer, String>();
// private JCheckBox showHiddenFilesCheckbox = new JCheckBox("显示隐藏文件", false);
private FileFilter docFilter = new DocFilter(); // 文档过滤器
private FileFilter dirFilter = new DirFilter(); // 文件夹过滤器
public FactTree(JFileChooser chooser, JTextPane pathsTextArea) {
super();
this.chooser = chooser;
this.pathsTextArea = pathsTextArea;
// this.pathsTextArea.setEditable(false);
StyleConstants.setFontSize(attrset, 12);
}
public void setStopped(boolean stopped) {
this.stopped = stopped;
}
@Override
public void run() {
File dir = chooser.getSelectedFile();
if (dir == null) {
dir = new File(".");
pathsTextArea.setText(dir.getName());
}
System.out.println("dir:" + dir.getAbsolutePath());
pathsTextArea.setText("");
stopped = false;
walkTree(dir, 0);
}
// 递归遍历目录树
private void walkTree(File dir, int level) {
// 1. current dir path
// 2. docs path that located in this dir
// 3. sub dirs path
// System.out.println(dir.getAbsolutePath() + ",00," + level);
if (stopped) {
return;
}
// System.out.println(dir.getAbsolutePath() + ",11," + level + "," + //
// dir.isHidden() + "," + showHiddenFilesCheckbox.isSelected());
// 如果不显示隐藏文件,则返回
// if (dir.isHidden() && !showHiddenFilesCheckbox.isSelected()) {
// return;
// }
if (!dir.canRead())
return;
// System.out.println(dir.getAbsolutePath() + ",22," + level);
final StringBuilder pathBuffer = new StringBuilder(1024);
// 访问当前目录
pathBuffer.append(createPath(dir, level));
// System.out.println(dir.getAbsolutePath() + ",1," + level);
// 访问文档
for (File doc : dir.listFiles(docFilter)) {
if (!doc.canRead()) {
continue;
}
// if (doc.isHidden() && !showHiddenFilesCheckbox.isSelected()) {
// continue;
// }
// System.out.println(dir.getAbsolutePath() + ",2," + level);
pathBuffer.append(createPath(doc, level + 1));
}
// System.out.println(dir.getAbsolutePath() + ",3," + level);
// 把当前目录下的文件更新到text area中
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// pathsTextArea.append(pathBuffer.toString());
StyledDocument docs = (StyledDocument) pathsTextArea.getDocument();
try {
// Style style = docs.addStyle("StyleName", null);
// StyleConstants.setIcon(style, new ImageIcon("c:/test/1.png"));
// docs.insertString(docs.getLength(), "ignored text", style);
docs.insertString(docs.getLength(), pathBuffer.toString(), attrset);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
});
// 递归遍历子目录
for (File subDir : dir.listFiles(dirFilter)) {
walkTree(subDir, level + 1);
}
}
// 创建文件的路径
public String createPath(File file, int level) {
StringBuilder pathBuffer = new StringBuilder(128);
// System.out.println(file.getAbsolutePath());
// System.out.println(file.getName());
pathBuffer.append(getPathIndex(level)).append(file.getName()).append("\n");
return pathBuffer.toString();
}
// 创建目录的缩进
private String getPathIndex(int level) {
// 如果不存在,则创建
if (pathIndexes.get(level) == null) {
StringBuilder indexBuffer = new StringBuilder(128);
for (int i = 0; i < level; ++i) {
indexBuffer.append("| ");
}
indexBuffer.append("|----");
pathIndexes.put(Integer.valueOf(level), indexBuffer.toString());
return indexBuffer.toString();
} else {
return pathIndexes.get(level);
}
}
}
class DocFilter implements FileFilter {
@Override
public boolean accept(File file) {
return file.isFile();
}
}
class DirFilter implements FileFilter {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
}
MARKDOWN是要比富文本方便点
- 呵呵
然后说下脚本
就以windows脚本为例啦,其实很简单,打好的假包朝一个固定路径一甩,然后就可以当dll来用啦 代码片
.
echo off
cls
set curdir1=%~dp0
set curdriv1=%~d0
cd %curdir1%
%curdriv1%
java -jar "D:\pqy\shortcut\runinpath\wdgl.jar" %curdir1%
完鸟
以前从来不粘完整代码的,最多就是粘点snippet,今天破例一次,因为夹娃代码是在网上下下来的,只是稍微改了下而已,尊重他人劳动成果,附上他的连接https://wenda.so.com/q/1528356215218392
上一篇: 朴素贝叶斯分类及python实现
下一篇: java工程师面试题