Skip to content

Commit 689b179

Browse files
committed
1、更新Readme文件;2、优化hosts编辑工具
1 parent 1e4b934 commit 689b179

5 files changed

Lines changed: 138 additions & 54 deletions

File tree

README.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ xJavaFxTool是使用javaFx开发的实用小工具集,目前项目刚刚建立
2121

2222
(本地需要有jdk1.8环境)[xJavaFxTool-windows-x86-0.1.5.exe](http://files.git.oschina.net/group1/M00/07/7A/PaAvDFzB0GOABoCNBVH8ANNaC7w019.exe?token=8ef89a36b221011fb716294680a185e0&ts=1556206916&attname=xJavaFxTool-windows-x86-0.1.5.exe) (Windows平台32位运行包)
2323

24-
支持插件开发,将插件jar包放至根目录libs下即可自动加载(插件开发示例见[开源项目xJavaFxPlugIn](https://gitee.com/xwintop/xJavaFxPlugIn)目前刚刚搭建,后续会持续更新);
24+
支持插件开发,将插件jar包放至根目录libs下即可自动加载(插件开发示例见[开源项目xJavaFxPlugIn](https://gitee.com/xwintop/xJavaFxPlugIn)后续准备将小工具拆分至各插件中按需加载);
2525

2626
#### 环境搭建说明:
2727
- 开发环境为jdk1.8,基于maven构建;
@@ -259,39 +259,39 @@ xJavaFxTool
259259

260260
#### 特别感谢
261261
在一个人还年轻的时候,我觉得,就应该着手致力做一些对社会有意义的事情,一如开源。至此,感谢以下贡献者(排名不分先后):
262-
+ 李柱
263-
+ luming
264-
+ 码志
262+
+ [李柱](https://gitee.com/loyalty521)
263+
+ [luming](https://gitee.com/jeeweb)
264+
+ [码志](https://gitee.com/dazer1992)
265265
+ 你的女神
266266

267267
#### 后续计划
268268
不定期添加汇总开发过程中需求的痛点工具,大家有工作上的痛点处可进群讨论,后期可能就会出相应的工具解决方案,谢谢大家的支持。
269269

270270
#### 项目截图如下:
271271

272-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/传输工具.png "传输工具.png")
273-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/文件复制.png "文件复制.png")
274-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/邮件发送工具.png "邮件发送工具.png")
275-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Cron表达式生成器.png "Cron表达式生成器.png")
276-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Mq调试工具.png "Mq调试工具.png")
277-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/正则表达式生成工具.png "正则表达式生成工具.png")
278-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/二维码生成工具.png "二维码生成工具.png")
279-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/json格式化编辑工具.png "json格式化编辑工具.png")
280-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/网址缩短.png "网址缩短.png")
281-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/字符串转换.png "字符串转换.png")
282-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Http调试工具.png "Http调试工具.png")
283-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/编码转换.png "编码转换.png")
284-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/转义字符.png "转义字符.png")
285-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/加密解密.png "加密解密.png")
286-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Time转换.png "Time转换.png")
287-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/图标生成工具.png "图标生成工具.png")
288-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Redis连接工具.png "Redis连接工具.png")
289-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Ftp服务器.png "Ftp服务器.png")
290-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/文件列表生成器.png "文件列表生成器.png")
291-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/图片压缩工具.png "图片压缩工具.png")
292-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Ftp客户端调试工具.png "Ftp客户端调试工具.png")
293-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Pdf转换工具.png "Pdf转换工具.png")
294-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/图片转码工具.png "图片转码工具.png")
295-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/Cmd调试工具.png "Cmd调试工具.png")
296-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/短信群发工具.png "短信群发工具.png")
297-
![输入图片说明](https://git.oschina.net/xwintop/xJavaFxTool/raw/master/images/zookeeper工具.png "zookeeper工具.png")
272+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/传输工具.png "传输工具.png")
273+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/文件复制.png "文件复制.png")
274+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/邮件发送工具.png "邮件发送工具.png")
275+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Cron表达式生成器.png "Cron表达式生成器.png")
276+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Mq调试工具.png "Mq调试工具.png")
277+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/正则表达式生成工具.png "正则表达式生成工具.png")
278+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/二维码生成工具.png "二维码生成工具.png")
279+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/json格式化编辑工具.png "json格式化编辑工具.png")
280+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/网址缩短.png "网址缩短.png")
281+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/字符串转换.png "字符串转换.png")
282+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Http调试工具.png "Http调试工具.png")
283+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/编码转换.png "编码转换.png")
284+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/转义字符.png "转义字符.png")
285+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/加密解密.png "加密解密.png")
286+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Time转换.png "Time转换.png")
287+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/图标生成工具.png "图标生成工具.png")
288+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Redis连接工具.png "Redis连接工具.png")
289+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Ftp服务器.png "Ftp服务器.png")
290+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/文件列表生成器.png "文件列表生成器.png")
291+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/图片压缩工具.png "图片压缩工具.png")
292+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Ftp客户端调试工具.png "Ftp客户端调试工具.png")
293+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Pdf转换工具.png "Pdf转换工具.png")
294+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/图片转码工具.png "图片转码工具.png")
295+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/Cmd调试工具.png "Cmd调试工具.png")
296+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/短信群发工具.png "短信群发工具.png")
297+
![输入图片说明](https://gitee.com/xwintop/xJavaFxTool/raw/master/images/zookeeper工具.png "zookeeper工具.png")

src/main/java/com/xwintop/xJavaFxTool/controller/debugTools/SwitchHostsToolController.java

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
import com.xwintop.xJavaFxTool.view.debugTools.SwitchHostsToolView;
55
import javafx.concurrent.Task;
66
import javafx.event.ActionEvent;
7+
import javafx.event.EventHandler;
78
import javafx.fxml.FXML;
89
import javafx.scene.control.TreeItem;
10+
import javafx.scene.input.KeyCode;
11+
import javafx.scene.input.KeyCodeCombination;
12+
import javafx.scene.input.KeyCombination;
13+
import javafx.scene.input.KeyEvent;
914
import lombok.Getter;
1015
import lombok.Setter;
1116
import lombok.extern.slf4j.Slf4j;
12-
import org.fxmisc.richtext.CodeArea;
1317
import org.fxmisc.richtext.LineNumberFactory;
1418
import org.fxmisc.richtext.model.StyleSpans;
1519
import org.fxmisc.richtext.model.StyleSpansBuilder;
@@ -46,6 +50,7 @@ public class SwitchHostsToolController extends SwitchHostsToolView {
4650
@Override
4751
public void initialize(URL location, ResourceBundle resources) {
4852
try {
53+
executor = Executors.newSingleThreadExecutor();
4954
initView();
5055
initEvent();
5156
initService();
@@ -55,41 +60,48 @@ public void initialize(URL location, ResourceBundle resources) {
5560
}
5661

5762
private void initView() {
58-
executor = Executors.newSingleThreadExecutor();
59-
hostTextArea = new CodeArea();
63+
hostTextArea.getStylesheets().add(getClass().getClassLoader().getResource("css/debugTools/hosts-keywords.css").toExternalForm());
6064
hostTextArea.setParagraphGraphicFactory(LineNumberFactory.get(hostTextArea));
6165
hostTextArea.richChanges()
6266
.filter(ch -> !ch.getInserted().equals(ch.getRemoved())) // XXX
6367
.successionEnds(Duration.ofMillis(500))
6468
.supplyTask(this::computeHighlightingAsync)
6569
.awaitLatest(hostTextArea.richChanges())
6670
.filterMap(t -> {
67-
if(t.isSuccess()) {
71+
if (t.isSuccess()) {
6872
return Optional.of(t.get());
6973
} else {
7074
t.getFailure().printStackTrace();
7175
return Optional.empty();
7276
}
7377
})
7478
.subscribe(this::applyHighlighting);
79+
hostTextArea.setOnKeyPressed(new EventHandler<KeyEvent>() {
80+
@Override
81+
public void handle(KeyEvent event) {
82+
if (new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN).match(event)) {
83+
switchHostsToolService.editAction();
84+
}
7585

86+
}
87+
});
7688
TreeItem<String> treeItem = new TreeItem<String>("Hosts");
7789
treeItem.setExpanded(true);
7890
hostFileTreeView.setRoot(treeItem);
79-
TreeItem<String> commonHostTreeItem = new TreeItem<String>("公共Host");
91+
// TreeItem<String> commonHostTreeItem = new TreeItem<String>("公共Host");
8092
TreeItem<String> systemHostTreeItem = new TreeItem<String>("系统当前Host");
81-
TreeItem<String> localHostTreeItem = new TreeItem<String>("本地方案");
82-
localHostTreeItem.setExpanded(true);
83-
TreeItem<String> localHostTreeItem1 = new TreeItem<String>("方案一");
84-
TreeItem<String> localHostTreeItem2 = new TreeItem<String>("方案二");
85-
localHostTreeItem.getChildren().add(localHostTreeItem1);
86-
localHostTreeItem.getChildren().add(localHostTreeItem2);
87-
TreeItem<String> webTreeItem = new TreeItem<String>("在线方案");
88-
webTreeItem.setExpanded(true);
89-
treeItem.getChildren().add(commonHostTreeItem);
93+
// TreeItem<String> localHostTreeItem = new TreeItem<String>("本地方案");
94+
// localHostTreeItem.setExpanded(true);
95+
// TreeItem<String> localHostTreeItem1 = new TreeItem<String>("方案一");
96+
// TreeItem<String> localHostTreeItem2 = new TreeItem<String>("方案二");
97+
// localHostTreeItem.getChildren().add(localHostTreeItem1);
98+
// localHostTreeItem.getChildren().add(localHostTreeItem2);
99+
// TreeItem<String> webTreeItem = new TreeItem<String>("在线方案");
100+
// webTreeItem.setExpanded(true);
101+
// treeItem.getChildren().add(commonHostTreeItem);
90102
treeItem.getChildren().add(systemHostTreeItem);
91-
treeItem.getChildren().add(localHostTreeItem);
92-
treeItem.getChildren().add(webTreeItem);
103+
// treeItem.getChildren().add(localHostTreeItem);
104+
// treeItem.getChildren().add(webTreeItem);
93105
}
94106

95107
private void initEvent() {
@@ -138,11 +150,12 @@ private static StyleSpans<Collection<String>> computeHighlighting(String text) {
138150
int lastKwEnd = 0;
139151
StyleSpansBuilder<Collection<String>> spansBuilder
140152
= new StyleSpansBuilder<>();
141-
while(matcher.find()) {
153+
while (matcher.find()) {
142154
String styleClass =
143155
matcher.group("KEYWORD") != null ? "keyword" :
144156
matcher.group("COMMENT") != null ? "comment" :
145-
null; /* never happens */ assert styleClass != null;
157+
null; /* never happens */
158+
assert styleClass != null;
146159
spansBuilder.add(Collections.emptyList(), matcher.start() - lastKwEnd);
147160
spansBuilder.add(Collections.singleton(styleClass), matcher.end() - matcher.start());
148161
lastKwEnd = matcher.end();

src/main/java/com/xwintop/xJavaFxTool/controller/developTools/xTransferTool/TransferToolTaskViewController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void changed(ObservableValue<? extends String> observable, String oldValu
9999
if (event.getButton() == MouseButton.SECONDARY) {
100100
Menu menu = new Menu("添加");
101101
String packageName = "com.xwintop.xTransfer.receiver.bean";
102-
String[] classNameS = new String[]{"ReceiverConfigDataBus",
102+
String[] classNameS = new String[]{
103103
"ReceiverConfigEmail",
104104
"ReceiverConfigFs",
105105
"ReceiverConfigFsSplit",

src/main/java/com/xwintop/xJavaFxTool/services/debugTools/SwitchHostsToolService.java

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
import com.sun.jna.Platform;
44
import com.xwintop.xJavaFxTool.controller.debugTools.SwitchHostsToolController;
55
import com.xwintop.xcore.util.javafx.TooltipUtil;
6+
import javafx.scene.control.Alert;
7+
import javafx.scene.control.TextInputDialog;
68
import lombok.Getter;
79
import lombok.Setter;
810
import lombok.extern.slf4j.Slf4j;
911
import org.apache.commons.io.FileUtils;
12+
import org.apache.commons.lang3.SystemUtils;
1013

14+
import java.io.BufferedReader;
1115
import java.io.File;
16+
import java.io.IOException;
17+
import java.io.InputStreamReader;
18+
import java.util.Optional;
1219

1320
/**
1421
* @ClassName: SwitchHostsToolService
@@ -22,6 +29,7 @@
2229
@Slf4j
2330
public class SwitchHostsToolService {
2431
private SwitchHostsToolController switchHostsToolController;
32+
private static String sudoPwd = null;
2533

2634
private String commonHostString = "# common\n" +
2735
"# 这儿是公用 hosts,其内容会插入到各个方案最前面";
@@ -36,20 +44,75 @@ public void reloadSystemHosts() throws Exception {
3644
String fileName = this.getHostsFilePath();
3745
String systemHostString = FileUtils.readFileToString(new File(fileName));
3846
// switchHostsToolController.getHostTextArea().setText(systemHostString);
47+
switchHostsToolController.getHostTextArea().clear();
3948
switchHostsToolController.getHostTextArea().replaceText(0, 0, systemHostString);
4049
}
4150

42-
public void editAction() throws Exception {
43-
String fileName = this.getHostsFilePath();
44-
String systemHostString = switchHostsToolController.getHostTextArea().getText();
45-
FileUtils.writeByteArrayToFile(new File(fileName), systemHostString.getBytes());
46-
TooltipUtil.showToast("保存配置成功");
51+
public void editAction() {
52+
Boolean ret = this.saveHostsContent(switchHostsToolController.getHostTextArea().getText());
53+
if (ret == true) {
54+
TooltipUtil.showToast("save success!");
55+
switchHostsToolController.getHostTextArea().setStyle("-fx-border-color: green;");
56+
} else {
57+
TooltipUtil.showToast("save error!");
58+
switchHostsToolController.getHostTextArea().setStyle("-fx-border-color: red;");
59+
}
4760
}
4861

4962
public SwitchHostsToolService(SwitchHostsToolController switchHostsToolController) {
5063
this.switchHostsToolController = switchHostsToolController;
5164
}
5265

66+
public Boolean saveHostsContent(String fileContent) {
67+
String fileName = this.getHostsFilePath();
68+
File file = new File(fileName);
69+
try {
70+
if (SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_UNIX) {
71+
if (sudoPwd == null) {
72+
TextInputDialog dialog = new TextInputDialog("");
73+
dialog.setTitle("Sudo Dialog");
74+
dialog.setHeaderText("Look, a Sudo Input Dialog");
75+
dialog.setContentText("Please enter your sudo pwd:");
76+
77+
Optional<String> result = dialog.showAndWait();
78+
if (result.isPresent()) {
79+
80+
}
81+
result.ifPresent(pwd -> sudoPwd = pwd);
82+
83+
String[] cmds = {"/bin/bash", "-c", "echo \"" + sudoPwd + "\" | " + "sudo" + " -S " + " chmod 777 " + file};
84+
Process process = Runtime.getRuntime().exec(cmds);
85+
86+
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
87+
String line;
88+
Boolean isSucc = true;
89+
while ((line = bufferedReader.readLine()) != null) {
90+
if (line.contains("try again")) {
91+
isSucc = false;
92+
}
93+
}
94+
95+
if (!isSucc) {
96+
sudoPwd = null;
97+
98+
Alert alert = new Alert(Alert.AlertType.ERROR);
99+
alert.setTitle("Wrong Password");
100+
alert.setHeaderText("Wrong Password");
101+
alert.setContentText("Please try agian");
102+
alert.showAndWait();
103+
104+
return false;
105+
}
106+
}
107+
}
108+
FileUtils.writeStringToFile(file, fileContent, "UTF-8");
109+
} catch (IOException e) {
110+
log.error("报错hosts文件失败", e);
111+
return false;
112+
}
113+
return true;
114+
}
115+
53116
public String getHostsFilePath() {
54117
String fileName = null;
55118
if (Platform.isWindows()) {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.keyword {
2+
-fx-fill: #0080ff;
3+
-fx-font-weight: bold;
4+
}
5+
6+
.comment {
7+
-fx-fill: #008040;
8+
}

0 commit comments

Comments
 (0)