2023年10月10日14:51:17

master
zhangmeng 2023-10-10 14:51:32 +08:00
parent ec9eace48c
commit e41bf5ffc7
6 changed files with 358 additions and 157 deletions

23
mystyle-java-fx-tools.ini Normal file
View File

@ -0,0 +1,23 @@
#
# TimiFXExamples 配置文件,不建议手动修改,可能会导致程序异常或崩溃
#
[Main]
# 语言
Lang=zh_CN
# 窗体宽度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 1300
Width=1300
# 窗体高度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 850
Height=850
# 编辑器主题
AceJsThem=kr_theme
[Interpolator]
# 动画插值器持续时间
Duration=1000

View File

@ -1,5 +1,7 @@
package com.zhangmeng.tools.controller;
import com.sun.javafx.PlatformUtil;
import com.zhangmeng.tools.components.RecursiveFileList;
import com.zhangmeng.tools.dto.FileTreeView;
import com.zhangmeng.tools.editors.ace.AceEditor;
import com.zhangmeng.tools.editors.ace.AceMode;
@ -12,6 +14,7 @@ import com.zhangmeng.tools.utils.ImagePath;
import com.zhangmeng.tools.utils.ResourcesUtils;
import eu.mihosoft.monacofx.Editor;
import eu.mihosoft.monacofx.MonacoFX;
import javafx.application.Platform;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
@ -19,27 +22,29 @@ import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.*;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
import lombok.extern.slf4j.Slf4j;
import net.imyeyu.timifx.service.RunAsync;
import org.apache.commons.io.FilenameUtils;
import org.fxmisc.flowless.VirtualizedScrollPane;
import org.fxmisc.richtext.CodeArea;
@ -53,25 +58,29 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static net.imyeyu.timifx.TimiFX.BORDER_EXLEFT;
@Slf4j
public class EditorListImplController {
@FXML
public MenuItem open_file;
@FXML
public MenuItem open_dir;
@FXML
public MenuItem save;
public enum Type {
JAVA,
HTML,
GO,
JS,
CSS,
SQL,
XML,
YML,
MARKDOWN
JAVA, HTML, GO, JS, CSS, SQL, XML, YML, MARKDOWN
}
private TabPane tabPane = null;
private SimpleDoubleProperty width = new SimpleDoubleProperty(0.0);
private SimpleDoubleProperty height = new SimpleDoubleProperty(0.0);
private AnchorPane root;
@ -82,7 +91,7 @@ public class EditorListImplController {
private AnchorPane timiFx;
private SimpleObjectProperty<File> choose_file = new SimpleObjectProperty<>(null);
private final ObservableList<Path> filePaths_list = FXCollections.observableArrayList();
public static final String color_cell = "#f4f4f4";
@FXML
@ -91,6 +100,8 @@ public class EditorListImplController {
@FXML
private SplitPane splitPane;
private static final Map<Path, Tab> map = new HashMap<>();
@FXML
public void date_query_menu_item() {
load_small_tools(5);
@ -354,8 +365,61 @@ public class EditorListImplController {
return listCell;
}
});
tabPane = new TabPane();
//添加菜单
addMenu();
File file = null;
FileTreeView fileTreeView = new FileTreeView(file);
fileTreeView.setBorder(BORDER_EXLEFT);
fileTreeView.setFixedCellSize(40);
splitPane.getItems().clear();
splitPane.getItems().add(0, fileTreeView);
splitPane.getItems().add(1, tabPane);
splitPane.setDividerPosition(0, 0.20);
splitPane.setDividerPosition(1, 0.80);
}
acJsEditor(false);
public void addMenu() {
// 设置快捷键
save.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCodeCombination.CONTROL_DOWN));
save.setOnAction(event -> writer_file());
open_file.setAccelerator(new KeyCodeCombination(KeyCode.F, KeyCodeCombination.CONTROL_DOWN));
open_file.setOnAction(event -> open_file());
open_dir.setAccelerator(new KeyCodeCombination(KeyCode.D, KeyCodeCombination.CONTROL_DOWN));
open_dir.setOnAction(event -> open_file_dir());
}
public void open_file() {
Stage stage = new Stage();
FileChooser dc = new FileChooser();
dc.setTitle("文件选择");
dc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("文件类型", "*.java", "*.go", "*.txt", "*.json", "*.sql"));
File file = dc.showOpenDialog(stage);
if (file != null) {
refresh(file, 0);
}
}
public void open_file_dir() {
Stage stage = new Stage();
DirectoryChooser dc = new DirectoryChooser();
dc.setTitle("文件夹选择");
File file = dc.showDialog(stage);
if (file != null) {
if (file.isDirectory()) {
refresh(file, 1);
}
}
}
public void refresh(File file, int type) {
file_checked(file, type);
}
private void acJsEditor(boolean flag) {
@ -439,7 +503,7 @@ public class EditorListImplController {
AlertUtils.alert_warning("tab " + choose_file.get().getName() + "保存成功!");
}
public void file_checked(File file) {
public void file_checked(File file, int open_type) {
String extension = FilenameUtils.getExtension(file.getName());
boolean flag = true;
@ -492,63 +556,139 @@ public class EditorListImplController {
if (extension.equals("yml")) {
type = Type.YML;
}
if (extension.equals("md")) {
type = Type.MARKDOWN;
}
if (type == null) {
type = Type.JAVA;
}
if (type == null) {
type = Type.MARKDOWN;
}
open_file(file, type);
open_file(file, type, open_type);
} else {
AlertUtils.alert_warning("该文件不支持!");
}
}
public void open_file(File file, Type type) {
public void open_file(File file, Type type, int open_type) {
String file_content = null;
try {
file_content = Files.readString(choose_file.get().toPath(), StandardCharsets.UTF_8);
} catch (IOException e) {
try {
file_content = Files.readString(choose_file.get().toPath(), Charset.forName("GBK"));
} catch (IOException ex) {
ex.printStackTrace();
}
//打开文件
//打开文件夹
choose_file.setValue(file);
if (open_type == 1) {
common_method();
}
int index = listView.getSelectionModel().getSelectedIndex();
switch (index) {
case 0 -> {
switch (type){
case JAVA -> acJsEditor.setAceMode(AceMode.JAVA);
case HTML -> acJsEditor.setAceMode(AceMode.HTML);
case XML -> acJsEditor.setAceMode(AceMode.XML);
case SQL -> acJsEditor.setAceMode(AceMode.SQL);
case MARKDOWN -> acJsEditor.setAceMode(AceMode.MARKDOWN);
}
acJsEditor.setAceText(file_content);
Path path = file.toPath();
if (filePaths_list.contains(path)) {//size -1 ,szie -2
//切换到一打开的tab
Tab tab = map.get(path);
if (!tabPane.getTabs().contains(tab)) {
tabPane.getTabs().add(tab);
}
tabPane.getSelectionModel().select(tab);
} else {
if (choose_file.get().isFile()) {
//异步加载
RunAsync.runback(() -> {
String file_content = null;
try {
file_content = Files.readString(choose_file.get().toPath(), StandardCharsets.UTF_8);
} catch (IOException e) {
try {
file_content = Files.readString(choose_file.get().toPath(), Charset.forName("GBK"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
return file_content;
}, file_content -> {
Tab tab = new Tab(file.getName());
ContextMenu contextMenu = new ContextMenu();
MenuItem close = new MenuItem("close");
MenuItem close_other_tabs = new MenuItem("close other tabs");
MenuItem close_all = new MenuItem("close all");
close_all.setOnAction(event -> {
tabPane.getTabs().clear();
});
close_other_tabs.setOnAction(event -> {
ObservableList<Tab> tabs = tabPane.getTabs();
ObservableList<Tab> list = FXCollections.observableArrayList(tabs);
//关闭其他
for (Tab tabPaneTab : list) {
if (tabPaneTab != tabPane.getSelectionModel().getSelectedItem()) {
tabs.remove(tabPaneTab);
}
}
});
close.setOnAction(event -> {
//关闭当前窗口
Tab selectedItem = tabPane.getSelectionModel().getSelectedItem();
tabPane.getTabs().remove(selectedItem);
});
contextMenu.getItems().add(close);
contextMenu.getItems().add(close_other_tabs);
contextMenu.getItems().add(close_all);
tab.setContextMenu(contextMenu);
tab.setOnCloseRequest(new EventHandler<Event>() {
@Override
public void handle(Event event) {
// log.info("tabtab.setOnCloseRequest:--->" + tab.getText());
tabPane.getTabs().remove(tab);
}
});
AceMode mode = null;
switch (type) {
case JAVA -> mode = AceMode.JAVA;
case HTML -> mode = AceMode.HTML;
case XML -> mode = AceMode.XML;
case SQL -> mode = AceMode.SQL;
case MARKDOWN -> mode = AceMode.MARKDOWN;
}
//新建编辑器
AceEditor editor = new AceEditor(choose_file.getValue(),mode,null);
WebView view = editor.getWebView();
AnchorPane.setTopAnchor(view, 0.0);
AnchorPane.setBottomAnchor(view, 0.0);
AnchorPane.setLeftAnchor(view, 0.0);
AnchorPane.setRightAnchor(view, 0.0);
tab.setContent(editor);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);
filePaths_list.add(path);
map.put(path, tab);
});
}
case 1 -> monacoEdit.setText(file_content);
case 2 -> codemirror.setText(file_content);
}
}
/**
* File file = new File("D:\\generate");
*/
private void common_method() {
//splitPane.getItems().remove(1);
File file = choose_file.get();
//添加菜单
splitPane.getItems().clear();
//添加文件选择
File file = new File("D:\\generate");
//添加文件选择
FileTreeView fileTreeView = new FileTreeView(file);
fileTreeView.setBorder(BORDER_EXLEFT);
fileTreeView.setFixedCellSize(40);
//fileTreeView.addItemFilter(file -> file.isDirectory() || file.getName().endsWith(".txt"));
splitPane.getItems().add(0, fileTreeView);
splitPane.getItems().add(1, root);
splitPane.getItems().add(1, tabPane);
splitPane.setDividerPosition(0, 0.2);
splitPane.setDividerPosition(1, 0.8);
@ -571,34 +711,36 @@ public class EditorListImplController {
if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
// 双击左键的操作
log.info("open file:" + choose_file.get().getName());
file_checked(choose_file.get());
if (choose_file.getValue() != null) {
file_checked(choose_file.get(), 0);
}
}
});
root.widthProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
double width = splitPane.getWidth();
EditorListImplController.this.width.set(width);
log.info("home:--->width:{}", width);
}
});
root.heightProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
double height = splitPane.getHeight();
EditorListImplController.this.height.set(height);
log.info("home:--->height:{}", height);
}
});
this.width.addListener((observable, oldValue, newValue) -> {
EditorListImplController.this.root.setPrefWidth(newValue.doubleValue() - listView.getWidth());
log.info("root:=====================>width:" + (newValue.doubleValue() - listView.getWidth()));
});
this.height.addListener((observable, oldValue, newValue) -> {
EditorListImplController.this.root.setPrefHeight(newValue.doubleValue() - listView.getHeight());
log.info("root:=====================>:height" + (newValue.doubleValue() - listView.getWidth()));
});
// root.widthProperty().addListener((observable, oldValue, newValue) -> {
// if (newValue != null) {
// double width = splitPane.getWidth();
// EditorListImplController.this.width.set(width);
// log.info("home:--->width:{}", width);
// }
// });
// root.heightProperty().addListener((observable, oldValue, newValue) -> {
// if (newValue != null) {
// double height = splitPane.getHeight();
// EditorListImplController.this.height.set(height);
// log.info("home:--->height:{}", height);
// }
// });
//
// this.width.addListener((observable, oldValue, newValue) -> {
// EditorListImplController.this.root.setPrefWidth(newValue.doubleValue() - listView.getWidth());
// log.info("root:=====================>width:" + (newValue.doubleValue() - listView.getWidth()));
// });
//
// this.height.addListener((observable, oldValue, newValue) -> {
// EditorListImplController.this.root.setPrefHeight(newValue.doubleValue() - listView.getHeight());
// log.info("root:=====================>:height" + (newValue.doubleValue() - listView.getWidth()));
// });
}
@FXML

View File

@ -105,10 +105,10 @@ public class FileTreeView extends XTreeView<File> implements TimiFX {
this.refreshItem((TreeItem)this.getSelectionModel().getSelectedItem());
});
List<File> roots = new ArrayList<>();
roots.add(root);
if (root != null){
roots.add(root);
}
menuDestroy.disableProperty().bind(Bindings.createBooleanBinding(() -> {
ObservableList<TreeItem<File>> items = this.getSelectionModel().getSelectedItems();

View File

@ -80,6 +80,27 @@ public class AceEditor extends AnchorPane {
initialize();
}
public AceEditor(File file,AceMode mode,AceTheme theme) {
String file_content = null;
try {
file_content = Files.readString(file.toPath(), StandardCharsets.UTF_8);
} catch (IOException e) {
try {
file_content = Files.readString(file.toPath(), Charset.forName("GBK"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
this.file = file;
if (theme != null){
this.theme.setValue(theme);
}
this.mode = mode;
setText(file_content);
initialize();
}
public AceEditor(String text) {
setText(text);
initialize();

View File

@ -7,129 +7,140 @@
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="800.0"
prefWidth="1661.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.zhangmeng.tools.controller.EditorListImplController">
<AnchorPane prefHeight="800.0" prefWidth="1661.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.tools.controller.EditorListImplController">
<children>
<MenuBar layoutX="14.0" layoutY="27.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0">
<MenuBar layoutX="14.0" layoutY="27.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<menus>
<Menu mnemonicParsing="false" text="加密工具">
<items>
<MenuItem mnemonicParsing="false" onAction="#md5_menu_item" text="md5 加密"/>
<MenuItem mnemonicParsing="false" onAction="#spring_security_menu_item" text="spring security 加密"/>
<MenuItem mnemonicParsing="false" onAction="#jks_file_menu_item" text="jkd 文件生成"/>
<MenuItem mnemonicParsing="false" onAction="#md5_menu_item" text="md5 加密" />
<MenuItem mnemonicParsing="false" onAction="#spring_security_menu_item" text="spring security 加密" />
<MenuItem mnemonicParsing="false" onAction="#jks_file_menu_item" text="jkd 文件生成" />
</items>
</items>
</Menu>
<Menu mnemonicParsing="false" text="影音工具">
<items>
<MenuItem mnemonicParsing="false" text="视频播放" onAction="#video_menu_item"/>
<MenuItem mnemonicParsing="false" text="音乐播放" onAction="#music_menu_item"/>
<MenuItem mnemonicParsing="false" text="vip 视频解析" onAction="#vip_parser_menu_item"/>
<MenuItem mnemonicParsing="false" text="音乐解析" onAction="#music_parser_menu_item"/>
<MenuItem mnemonicParsing="false" text="视频转码" onAction="#video_transcoder_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#video_menu_item" text="视频播放" />
<MenuItem mnemonicParsing="false" onAction="#music_menu_item" text="音乐播放" />
<MenuItem mnemonicParsing="false" onAction="#vip_parser_menu_item" text="vip 视频解析" />
<MenuItem mnemonicParsing="false" onAction="#music_parser_menu_item" text="音乐解析" />
<MenuItem mnemonicParsing="false" onAction="#video_transcoder_menu_item" text="视频转码" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="常用小工具">
<items>
<MenuItem mnemonicParsing="false" text="16进制Hex" onAction="#hex_16_menu_item"/>
<MenuItem mnemonicParsing="false" text="Unicode和字符串转换" onAction="#unicode_menu_item"/>
<MenuItem mnemonicParsing="false" text="jwt工具" onAction="#jwt_menu_item"/>
<MenuItem mnemonicParsing="false" text="颜色选择工具" onAction="#color_choose_menu_item"/>
<MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/>
<MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/>
<MenuItem mnemonicParsing="false" text="邮件发送" onAction="#mail_menu_item"/>
<MenuItem mnemonicParsing="false" text="手机号工具" onAction="#telephone_menu_item"/>
<MenuItem mnemonicParsing="false" text="JsonView" onAction="#JsonView_menu_item"/>
<MenuItem mnemonicParsing="false" text="maven-jar-install" onAction="#maven_jar_install_menu_item"/>
<MenuItem mnemonicParsing="false" text="word-ocr" onAction="#word_ocr_menu_item"/>
<MenuItem mnemonicParsing="false" text="条形码识别" onAction="#bar_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="pdf识别" onAction="#pdf_menu_item"/>
<MenuItem mnemonicParsing="false" text="批量修改文件名" onAction="#batch_update_file_name_menu_item"/>
<MenuItem mnemonicParsing="false" text="截图工具" onAction="#capter_screen_menu_item"/>
<MenuItem mnemonicParsing="false" text="文件编辑器" onAction="#file_edit_menu_item"/>
<MenuItem mnemonicParsing="false" text="LayUI表单代码生成" onAction="#layui_form_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="日志输出" onAction="#log_console_menu_item"/>
<MenuItem mnemonicParsing="false" text="EditPlus注册码生成" onAction="#edit_plus_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="minio文件上传" onAction="#minio_upload_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#hex_16_menu_item" text="16进制Hex" />
<MenuItem mnemonicParsing="false" onAction="#unicode_menu_item" text="Unicode和字符串转换" />
<MenuItem mnemonicParsing="false" onAction="#jwt_menu_item" text="jwt工具" />
<MenuItem mnemonicParsing="false" onAction="#color_choose_menu_item" text="颜色选择工具" />
<MenuItem mnemonicParsing="false" onAction="#qr_code_menu_item" text="二维码生成" />
<MenuItem mnemonicParsing="false" onAction="#date_query_menu_item" text="时间工具" />
<MenuItem mnemonicParsing="false" onAction="#cron_menu_item" text="cron表达式" />
<MenuItem mnemonicParsing="false" onAction="#mail_menu_item" text="邮件发送" />
<MenuItem mnemonicParsing="false" onAction="#telephone_menu_item" text="手机号工具" />
<MenuItem mnemonicParsing="false" onAction="#JsonView_menu_item" text="JsonView" />
<MenuItem mnemonicParsing="false" onAction="#maven_jar_install_menu_item" text="maven-jar-install" />
<MenuItem mnemonicParsing="false" onAction="#word_ocr_menu_item" text="word-ocr" />
<MenuItem mnemonicParsing="false" onAction="#bar_code_menu_item" text="条形码识别" />
<MenuItem mnemonicParsing="false" onAction="#pdf_menu_item" text="pdf识别" />
<MenuItem mnemonicParsing="false" onAction="#batch_update_file_name_menu_item" text="批量修改文件名" />
<MenuItem mnemonicParsing="false" onAction="#capter_screen_menu_item" text="截图工具" />
<MenuItem mnemonicParsing="false" onAction="#file_edit_menu_item" text="文件编辑器" />
<MenuItem mnemonicParsing="false" onAction="#layui_form_gen_menu_item" text="LayUI表单代码生成" />
<MenuItem mnemonicParsing="false" onAction="#log_console_menu_item" text="日志输出" />
<MenuItem mnemonicParsing="false" onAction="#edit_plus_code_menu_item" text="EditPlus注册码生成" />
<MenuItem mnemonicParsing="false" onAction="#minio_upload_menu_item" text="minio文件上传" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="编解码工具">
<Menu mnemonicParsing="false" text="编解码工具">
<items>
<MenuItem mnemonicParsing="false" text="Base62编码解码" onAction="#base_62_menu_item"/>
<MenuItem mnemonicParsing="false" text="Base64编码解码" onAction="#base_64_menu_item"/>
<MenuItem mnemonicParsing="false" text="Base32编码解码" onAction="#base_32_menu_item"/>
<MenuItem mnemonicParsing="false" text="摩尔斯电码" onAction="#morse_coder_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#base_62_menu_item" text="Base62编码解码" />
<MenuItem mnemonicParsing="false" onAction="#base_64_menu_item" text="Base64编码解码" />
<MenuItem mnemonicParsing="false" onAction="#base_32_menu_item" text="Base32编码解码" />
<MenuItem mnemonicParsing="false" onAction="#morse_coder_menu_item" text="摩尔斯电码" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="代码工具">
<Menu mnemonicParsing="false" text="代码工具">
<items>
<MenuItem mnemonicParsing="false" text="mysql代码生成" onAction="#sql_code_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="mybatis-plus 代码生成" onAction="#mybatis_plus_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="json转javaBean 代码生成" onAction="#json_javabean_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="sql 查询" onAction="#sql_query_gen_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#sql_code_gen_menu_item" text="mysql代码生成" />
<MenuItem mnemonicParsing="false" onAction="#mybatis_plus_gen_menu_item" text="mybatis-plus 代码生成" />
<MenuItem mnemonicParsing="false" onAction="#json_javabean_gen_menu_item" text="json转javaBean 代码生成" />
<MenuItem mnemonicParsing="false" onAction="#sql_query_gen_menu_item" text="sql 查询" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="http工具">
<Menu mnemonicParsing="false" text="http工具">
<items>
<MenuItem mnemonicParsing="false" text="http请求工具" onAction="#http_request_menu_item"/>
<MenuItem mnemonicParsing="false" text="http上传工具" onAction="#http_upload_menu_item"/>
<MenuItem mnemonicParsing="false" text="http下载工具" onAction="#http_download_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#http_request_menu_item" text="http请求工具" />
<MenuItem mnemonicParsing="false" onAction="#http_upload_menu_item" text="http上传工具" />
<MenuItem mnemonicParsing="false" onAction="#http_download_menu_item" text="http下载工具" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="server 工具">
<Menu mnemonicParsing="false" text="server 工具">
<items>
<MenuItem mnemonicParsing="false" text="http-server 请求工具" onAction="#http_server_menu_item"/>
<MenuItem mnemonicParsing="false" text="ftp-server 请求工具" onAction="#ftp_server_menu_item"/>
<MenuItem mnemonicParsing="false" text="ssh-client 请求工具" onAction="#ssh_client_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server 服务工具" onAction="#socket_server_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-client-aio 客户端工具" onAction="#socket_client_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-aio 服务端工具" onAction="#socket_server_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-nio 服务端工具" onAction="#socket_server_nio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-client-nio 客户端工具" onAction="#socket_client_nio_menu_item"/>
<MenuItem mnemonicParsing="false" text="web-socket-client 客户端工具" onAction="#web_socket_client_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#http_server_menu_item" text="http-server 请求工具" />
<MenuItem mnemonicParsing="false" onAction="#ftp_server_menu_item" text="ftp-server 请求工具" />
<MenuItem mnemonicParsing="false" onAction="#ssh_client_menu_item" text="ssh-client 请求工具" />
<MenuItem mnemonicParsing="false" onAction="#socket_server_menu_item" text="socket-server 服务工具" />
<MenuItem mnemonicParsing="false" onAction="#socket_client_aio_menu_item" text="socket-client-aio 客户端工具" />
<MenuItem mnemonicParsing="false" onAction="#socket_server_aio_menu_item" text="socket-server-aio 服务端工具" />
<MenuItem mnemonicParsing="false" onAction="#socket_server_nio_menu_item" text="socket-server-nio 服务端工具" />
<MenuItem mnemonicParsing="false" onAction="#socket_client_nio_menu_item" text="socket-client-nio 客户端工具" />
<MenuItem mnemonicParsing="false" onAction="#web_socket_client_menu_item" text="web-socket-client 客户端工具" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="go语言工具">
<Menu mnemonicParsing="false" text="go语言工具">
<items>
<MenuItem mnemonicParsing="false" text="json生成结构体" onAction="#json_to_struct_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#json_to_struct_menu_item" text="json生成结构体" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="编辑器工具">
<Menu mnemonicParsing="false" text="编辑器工具">
<items>
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="timefx 编辑器" onAction="#timeFx_fx_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#ace_js_menu_item" text="ace.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#monaco_js_menu_item" text="monaco.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#codemirror_js_menu_item" text="codemirror.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#timeFx_fx_menu_item" text="timefx 编辑器" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="编辑器">
<Menu mnemonicParsing="false" text="编辑器">
<items>
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_menu_item"/>
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_menu_item"/>
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_menu_item"/>
<MenuItem mnemonicParsing="false" text="timefx 编辑器" onAction="#timeFx_menu_item"/>
<MenuItem mnemonicParsing="false" onAction="#ace_menu_item" text="ace.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#monaco_menu_item" text="monaco.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#codemirror_menu_item" text="codemirror.js 编辑器" />
<MenuItem mnemonicParsing="false" onAction="#timeFx_menu_item" text="timefx 编辑器" />
</items>
</Menu>
</menus>
</menus>
</MenuBar>
<SplitPane fx:id="splitPane" dividerPositions="0.5" layoutY="25.0" prefHeight="575.0" prefWidth="1200.0"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="25.0">
<items>
<ListView fx:id="listView" maxWidth="300.0" minWidth="200.0" prefHeight="200.0" prefWidth="200.0"/>
<AnchorPane prefHeight="200.0" prefWidth="200.0"/>
</items>
</SplitPane>
<AnchorPane layoutY="25.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="25.0">
<children>
<SplitPane fx:id="splitPane" dividerPositions="0.5" prefHeight="575.0" prefWidth="1200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="25.0">
<items>
<ListView fx:id="listView" maxWidth="300.0" minWidth="200.0" prefHeight="634.0" prefWidth="295.0" />
<AnchorPane prefHeight="200.0" prefWidth="200.0" />
</items>
</SplitPane>
<MenuBar AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<menus>
<Menu mnemonicParsing="false" text="文件">
<items>
<MenuItem fx:id="open_file" mnemonicParsing="false" text="打开文件" />
<MenuItem fx:id="open_dir" mnemonicParsing="false" text="打开文件夹" />
<MenuItem fx:id="save" mnemonicParsing="false" text="保存" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
</children>
</AnchorPane>

View File

@ -13,6 +13,10 @@ Width=1300
# 窗体高度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 850
Height=850
# 编辑器主题
AceJsThem=kr_theme
[Interpolator]
# 动画插值器持续时间