JNotepad/src/main/java/org/jcnc/jnotepad/ViewManager.java
2023-08-11 04:28:31 +08:00

135 lines
4.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package org.jcnc.jnotepad;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
/**
* 该类管理记事本应用程序的视图组件。
*/
public class ViewManager {
public static final DataFormat TAB_DATA_FORMAT = new DataFormat("draggable-tab");
public static Label enCodingLabel; // 显示文本编码
public static int tabIndex = 0;
// 菜单栏组件
public static MenuBar menuBar; //菜单栏
public static Menu fileMenu; //文件菜单
public static MenuItem newItem, openItem, saveItem, saveAsItem; //新建/打开/保存/保存至 菜单
// 主界面布局
public static BorderPane root; //主布局
// 多个标签页
public static TabPane tabPane; //标签页栏
// 状态栏
public static Label statusLabel;
private static ViewManager instance = null;
/**
* 获取ViewManager的实例。如果实例不存在则创建一个新实例。
*
* @param scene 与视图相关联的JavaFX场景。
* @return ViewManager的实例。
*/
public static ViewManager getInstance(Scene scene) {
if (instance == null) {
instance = new ViewManager(scene);
}
return instance;
}
/**
* 构造函数。设置场景和根布局。
*
* @param scene 与视图相关联的JavaFX场景。
*/
private ViewManager(Scene scene) {
root = new BorderPane();
scene.setRoot(root);
}
/**
* 初始化屏幕组件。
*
* @param scene 与视图相关联的JavaFX场景。
*/
public void initScreen(Scene scene) {
// 创建菜单栏并添加菜单项
menuBar = new MenuBar();
fileMenu = new Menu("文件");
newItem = new MenuItem("新建");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
saveAsItem = new MenuItem("另存为");
fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem);
menuBar.getMenus().add(fileMenu);
// 创建主界面布局
root = new BorderPane();
root.setTop(menuBar);
// 创建标签页和文本编辑区域
tabPane = new TabPane();
root.setCenter(tabPane);
// 创建状态栏
statusLabel = new Label("行数1 \t列数1 \t字数0 ");
enCodingLabel = new Label(); // 创建新的标签以显示编码信息
HBox statusBox = new HBox(statusLabel, enCodingLabel); // 使用HBox放置状态标签和编码标签
root.setBottom(statusBox);
BorderPane.setMargin(statusBox, new Insets(5, 10, 5, 10));
// 给每个标签添加拖放功能
for (Tab tab : tabPane.getTabs()) {
addDragAndDropFunctionalityToTab(tab);
}
scene.setRoot(root);
}
/**
* 为标签添加拖放功能。
*
* @param tab 要添加拖放功能的标签。
*/
private void addDragAndDropFunctionalityToTab(Tab tab) {
tab.getTabPane().setOnDragDetected(event -> {
Dragboard dragboard = tab.getTabPane().startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.put(TAB_DATA_FORMAT, tab);
dragboard.setContent(content);
});
// 可选:为放置目标添加放置处理器(根据你的需求)
tab.getTabPane().setOnDragOver(event -> {
if (event.getDragboard().hasContent(TAB_DATA_FORMAT)) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
tab.getTabPane().setOnDragDropped(event -> {
Dragboard dragboard = event.getDragboard();
if (dragboard.hasContent(TAB_DATA_FORMAT)) {
Tab draggedTab = (Tab) dragboard.getContent(TAB_DATA_FORMAT);
// 在这里处理放置操作,例如重新排列标签
// 这可能需要修改你的标签的位置或交换标签的位置
event.setDropCompleted(true);
}
event.consume();
});
}
}