package xyz.wbsite.dbtool.javafx; import javafx.application.Application; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ChangeListener; 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.FXMLLoader; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.RadioButton; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.Toggle; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.control.cell.ChoiceBoxTableCell; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.control.cell.TextFieldTreeCell; import javafx.scene.image.Image; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.stage.WindowEvent; import javafx.util.Callback; import javafx.util.converter.DefaultStringConverter; import javafx.util.converter.IntegerStringConverter; import xyz.wbsite.dbtool.javafx.ctrl.DetailModuleController; import xyz.wbsite.dbtool.javafx.ctrl.DetailProjectController; import xyz.wbsite.dbtool.javafx.ctrl.DetailTableController; import xyz.wbsite.dbtool.javafx.ctrl.MainController; import xyz.wbsite.dbtool.javafx.manger.ManagerFactory; import xyz.wbsite.dbtool.javafx.manger.ProjectManager; import xyz.wbsite.dbtool.javafx.po.DataBase; import xyz.wbsite.dbtool.javafx.po.Field; import xyz.wbsite.dbtool.javafx.po.FieldType; import xyz.wbsite.dbtool.javafx.po.Module; import xyz.wbsite.dbtool.javafx.po.Project; import xyz.wbsite.dbtool.javafx.po.Table; import xyz.wbsite.dbtool.javafx.tool.Dialog; import xyz.wbsite.dbtool.javafx.tool.Tool; import xyz.wbsite.dbtool.javafx.view.DBCheckBoxTableCell; import xyz.wbsite.dbtool.web.frame.utils.ResourceUtil; import java.net.URL; import java.util.List; public class JavaFxApplication extends Application { private ProjectManager projectManager = ManagerFactory.getProjectManager(); private TreeView mTree = null; private Pane mDetail = null; private TableView mFields = null; private Button add = null; private Button sub = null; private FXMLLoader mMainLoader; private FXMLLoader mProjectLoader; private FXMLLoader mModuleLoader; private FXMLLoader mTableLoader; private MainController mainController; private DetailProjectController detailProjectController; private DetailModuleController detailModuleController; private DetailTableController detailTableController; private Project currentProject; private Module currentMD; private Table currentTable; private ContextMenu project_menu; private ContextMenu md_right_menu; private ContextMenu table_right_menu; private XEventHandler xEventHandler = new XEventHandler(); private boolean dragMD = false; @Override public void start(Stage primaryStage) throws Exception { BorderPane root = mMainLoader.getRoot(); primaryStage.setTitle("DBtool"); primaryStage.setScene(new Scene(root, 700, 500)); primaryStage.show(); primaryStage.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent event) { primaryStage.close(); System.exit(0); } }); primaryStage.getIcons().add(new Image(ResourceUtil.getResourceInput("icon.png"))); } @Override public void init() throws Exception { URL main = JavaFxApplication.class.getClassLoader().getResource("fxml/main.fxml"); if (main == null) { main = getClass().getResource("../../../fxml/main.fxml"); } mMainLoader = new FXMLLoader(main); mMainLoader.load(); mainController = mMainLoader.getController(); mainController.setMain(this); mTree = mainController.getDbtree(); mDetail = mainController.getDetail(); mFields = mainController.getFields(); mFields.setEditable(true); mFields.setSortPolicy(new Callback() { @Override public Boolean call(TableView param) { //禁止点击列头排序 return false; } }); add = mainController.getAdd(); add.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent event) { addField(); } }); sub = mainController.getSub(); sub.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent event) { subField(); } }); mFields.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent event) { int selectedIndex = mFields.getSelectionModel().getSelectedIndex(); if (currentTable == null || selectedIndex == -1) { return; } Field field = currentTable.getFields().get(selectedIndex); ContextMenu con = null; if (field.getFieldType().equals(FieldType.Dict.name())) { con = new ContextMenu( new MenuItem("新增"), new MenuItem("删除"), new MenuItem("编辑字典"), new MenuItem("向上调整"), new MenuItem("向下调整")); } else { con = new ContextMenu( new MenuItem("新增"), new MenuItem("删除"), new MenuItem("向上调整"), new MenuItem("向下调整")); } con.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { MenuItem target = (MenuItem) event.getTarget(); int index = mFields.getSelectionModel().getSelectedIndex(); List fields = currentTable.getFields(); if ("新增".equals(target.getText())) { addField(); } if (index != -1) { switch (target.getText()) { case "删除": subField(); break; case "向上调整": if (index > 0) { fields.add(index - 1, fields.get(index)); fields.add(index + 1, fields.get(index)); fields.remove(index); fields.remove(index + 1); } break; case "向下调整": if (index < fields.size() - 1) { fields.add(index, fields.get(index + 1)); fields.add(index + 2, fields.get(index + 1)); fields.remove(index + 1); fields.remove(index + 2); } break; case "编辑字典": Field field = fields.get(index); Dialog.showDictEdit(field); break; } JavaFxApplication.this.mFields.getSelectionModel().clearSelection(); } } }); mFields.setContextMenu(con); } }); project_menu = new ContextMenu(new MenuItem("新增模块")); md_right_menu = new ContextMenu(new MenuItem("新增对象"), new MenuItem("删除模块"), new MenuItem("向上调整"), new MenuItem("向下调整")); table_right_menu = new ContextMenu(new MenuItem("删除对象")); project_menu.setOnAction(xEventHandler); md_right_menu.setOnAction(xEventHandler); table_right_menu.setOnAction(xEventHandler); URL projectdetail = JavaFxApplication.class.getClassLoader().getResource("fxml/DetailProject.fxml"); if (projectdetail == null) { projectdetail = getClass().getResource("../../../fxml/DetailProject.fxml"); } mProjectLoader = new FXMLLoader(projectdetail); mProjectLoader.load(); detailProjectController = mProjectLoader.getController(); URL mddetail = JavaFxApplication.class.getClassLoader().getResource("fxml/DetailModule.fxml"); if (mddetail == null) { mddetail = getClass().getResource("../../../fxml/DetailModule.fxml"); } mModuleLoader = new FXMLLoader(mddetail); mModuleLoader.load(); detailModuleController = mModuleLoader.getController(); URL tabledetail = JavaFxApplication.class.getClassLoader().getResource("fxml/DetailTable.fxml"); if (tabledetail == null) { tabledetail = getClass().getResource("../../../fxml/DetailTable.fxml"); } mTableLoader = new FXMLLoader(tabledetail); mTableLoader.load(); detailTableController = mTableLoader.getController(); mTree.setShowRoot(true); mTree.setEditable(true); mTree.setDisable(false); mTree.setCellFactory(new Callback() { @Override public TreeCell call(TreeView param) { TextFieldTreeCell textFieldTreeCell = new TextFieldTreeCell(new DefaultStringConverter()); textFieldTreeCell.setEditable(false); // creating cell from deafult factory TreeCell treeCell = textFieldTreeCell.forTreeView().call(param); // setting handlers textFieldTreeCell.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent event) { TextFieldTreeCell source = (TextFieldTreeCell) event.getSource(); String text = source.getText(); Module dbByDBName = projectManager.findDBByDBName(text); if (dbByDBName != null) { dragMD = true; } else { dragMD = false; } if (dragMD) { System.out.println("拖拽模块:" + text); } else { System.out.println("拖拽对象:" + text); } Dragboard md = source.startDragAndDrop(TransferMode.ANY); ClipboardContent content = new ClipboardContent(); content.putString((String) source.getText()); md.setContent(content); event.consume(); } }); textFieldTreeCell.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard md = event.getDragboard(); TextFieldTreeCell source = (TextFieldTreeCell) event.getSource(); Module dbByDBName = projectManager.findDBByDBName(source.getText()); if (dragMD && dbByDBName != null) { double y = event.getY(); double height = textFieldTreeCell.getHeight(); if (source.getText().equals(md.getString())) { event.acceptTransferModes(TransferMode.MOVE); } else if (y >= height / 4 && y < height * 3 / 4) { event.acceptTransferModes(TransferMode.MOVE); } } if (!dragMD && dbByDBName == null) { double y = event.getY(); double height = textFieldTreeCell.getHeight(); if (y >= height / 4 && y < height * 3 / 4) { event.acceptTransferModes(TransferMode.MOVE); } else { event.acceptTransferModes(TransferMode.COPY); } } event.consume(); } }); textFieldTreeCell.setOnDragDropped(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard md = event.getDragboard(); String m1 = md.getString(); TreeCell source = (TreeCell) event.getSource(); String m2 = ((TreeCell) event.getGestureTarget()).getItem(); if (dragMD) { List mds = projectManager.getMds(); int i1 = 0, i2 = 0; for (int i = 0; i < mds.size(); i++) { if (mds.get(i).getModuleName().equals(m1)) { i1 = i; } if (mds.get(i).getModuleName().equals(m2)) { i2 = i; } } if (event.getTransferMode().equals(TransferMode.COPY)) {//插入 } else if (event.getTransferMode().equals(TransferMode.MOVE)) {//交换 Tool.exchange(mds, i1, i2); Tool.exchange(currentProject.getChildren(), i1, i2); } } else { if (currentMD != null) { int i1 = 0, i2 = 0; Table t1 = null, t2 = null; for (int i = 0; i < currentMD.getTables().size(); i++) { if (currentMD.getTables().get(i).getTableName().equals(m1)) { i1 = i; t1 = currentMD.getTables().get(i); } if (currentMD.getTables().get(i).getTableName().equals(m2)) { i2 = i; t2 = currentMD.getTables().get(i); } } if (t1 == null || t2 == null) { return; } if (event.getTransferMode().equals(TransferMode.COPY)) {//插入 double y = event.getY(); double height = textFieldTreeCell.getHeight(); if (y < height / 2) { currentMD.getTables().add(i2, t1); currentMD.getChildren().add(i2, t1); } else { currentMD.getTables().add(i2 + 1, t1); currentMD.getChildren().add(i2 + 1, t1); } if (i1 < i2) { currentMD.getTables().remove(i1); currentMD.getChildren().remove(i1); } else { currentMD.getTables().remove(i1 + 1); currentMD.getChildren().remove(i1 + 1); } } else if (event.getTransferMode().equals(TransferMode.MOVE)) {//交换 Tool.exchange(currentMD.getTables(), i1, i2); Tool.exchange(currentMD.getChildren(), i1, i2); } } } event.setDropCompleted(true); event.consume(); mTree.getSelectionModel().clearSelection(); int focusedIndex = mTree.getFocusModel().getFocusedIndex(); System.out.println(focusedIndex); } }); return textFieldTreeCell; } }); mTree.setOnEditCommit(new YEventHandler()); mTree.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent event) { TreeItem targetItem = (TreeItem) mTree.getSelectionModel().getSelectedItem(); if (targetItem == null) return; int level = getLevel(targetItem); switch (level) { case 0: {//查看模块 mTree.setContextMenu(project_menu); loadProject(); } break; case 1: {//查看模块 mTree.setContextMenu(md_right_menu); currentMD = projectManager.findDBByDBName((String) targetItem.getValue()); currentTable = null; loadingModule(); } break; case 2: {//查看对象 mTree.setContextMenu(table_right_menu); TreeItem parent = targetItem.getParent(); currentMD = projectManager.findDBByDBName((String) parent.getValue()); if (currentMD != null) { currentTable = projectManager.findTableByTableName(currentMD, (String) targetItem.getValue()); } initTable(); break; } default: break; } } }); {//初始化模块面板 detailModuleController.getModuleComment().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (currentMD != null) { currentMD.setModuleComment(newValue); } } }); detailModuleController.getModulePrefix().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (currentMD != null) { currentMD.setModulePrefix(newValue); } } }); detailModuleController.getModuleName().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (currentMD != null) { currentMD.setModuleName(newValue); } } }); detailModuleController.getIsGenerate().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (currentMD != null) { currentMD.setNeedGenerate(newValue); } } }); } {// 初始化项目面板 detailProjectController.getProjectName().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { currentProject.setProjectName(newValue); } }); detailProjectController.getProjectBasePackage().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { currentProject.setProjectBasePackage(newValue); } }); detailProjectController.getProjectAuthor().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { currentProject.setProjectAuthor(newValue); } }); detailProjectController.getNeedWeb().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedWeb(newValue); } }); detailProjectController.getSysMD().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedSys(newValue); } }); detailProjectController.getMultiDB().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedMoreDB(newValue); } }); detailProjectController.getCloud().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedCloud(newValue); } }); detailProjectController.getAsync().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedAsync(newValue); } }); detailProjectController.geteMail().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentProject.setNeedEMail(newValue); } }); detailProjectController.getDatabase().selectedToggleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Toggle oldValue, Toggle newValue) { RadioButton radioButton = (RadioButton) newValue; currentProject.setDatabase(DataBase.valueOf(radioButton.getText())); } }); } {//初始化表面板 detailTableController.getTablename().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (currentTable != null) { currentTable.setTableName(newValue); // invalidateLeft(); } } }); detailTableController.getTablecomment().textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (currentTable != null) { currentTable.setTableComment(newValue); } } }); detailTableController.getCreate().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setCreate(newValue); } }); detailTableController.getDelete().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setDelete(newValue); } }); detailTableController.getUpdate().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setUpdate(newValue); } }); detailTableController.getFind().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setFind(newValue); } }); detailTableController.getGet().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setGet(newValue); } }); detailTableController.getSearch().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setSearch(newValue); } }); detailTableController.getSys().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setSys(newValue); } }); detailTableController.getAjax().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setAjax(newValue); } }); detailTableController.getHtml().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setHtml(newValue); } }); detailTableController.getApi().selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { currentTable.setApi(newValue); } }); } ManagerFactory.getReflashManager(this).start(); loadProjectTree(); super.init(); } private void addField() { if (currentTable != null && mFields != null) { List fields = currentTable.getFields(); int i = projectManager.getNewFieldName(fields); Field field = fields.get(i); System.out.println("新增字段-" + field.getFieldName() + "成功!"); this.mFields.getSelectionModel().select(i); this.mFields.getFocusModel().focus(i); } } private void subField() { if (currentTable != null) { int selectedIndex = mFields.getSelectionModel().getSelectedIndex(); if (selectedIndex > -1 && !currentTable.getFields().get(selectedIndex).getIsSystem()) { currentTable.getFields().remove(selectedIndex); mFields.getSelectionModel().clearSelection(); } } } public void loadProjectTree() { currentProject = projectManager.getProject(); currentProject.setValue(currentProject.getProjectName()); currentProject.setExpanded(true); mTree.setRoot(currentProject); for (int i = 0; i < currentProject.getModules().size(); i++) { Module module = currentProject.getModules().get(i); module.setExpanded(true); for (Table table : module.getTables()) { table.setExpanded(true); module.getChildren().add(table); } } } private int getLevel(TreeItem treeItem) { TreeItem root = mTree.getRoot(); int level = 0; if (treeItem == root) { level = 0; } else if (treeItem.getParent() == root) { level = 1; } else if (treeItem.getParent().getParent() == root) { level = 2; } return level; } private void loadingModule() { if (currentMD == null) { return; } GridPane gridPane = mModuleLoader.getRoot(); detailModuleController.getModuleComment().setText(currentMD.getModuleComment()); detailModuleController.getModulePrefix().setText(currentMD.getModulePrefix()); detailModuleController.getModuleName().setText(currentMD.getModuleName()); detailModuleController.getIsGenerate().setSelected(currentMD.getNeedGenerate()); if (gridPane != null) { mDetail.getChildren().clear(); mDetail.getChildren().add(gridPane); } if (mFields != null && mFields.getItems() != null) { mFields.setItems(null); } } /** * 加载表项目面板 */ public void loadProject() { GridPane gridPane = mProjectLoader.getRoot(); detailProjectController.getProjectName().setText(currentProject.getProjectName()); detailProjectController.getProjectBasePackage().setText(currentProject.getProjectBasePackage()); detailProjectController.getProjectAuthor().setText(currentProject.getProjectAuthor()); ObservableList toggles = detailProjectController.getDatabase().getToggles(); for (Toggle tog : toggles) { RadioButton radioButton = (RadioButton) tog; if (radioButton.getText().equals(currentProject.getDatabase().name())) { radioButton.setSelected(true); } } detailProjectController.getNeedWeb().setSelected(currentProject.isNeedWeb()); detailProjectController.getSysMD().setSelected(currentProject.isNeedSys()); detailProjectController.getMultiDB().setSelected(currentProject.isNeedMoreDB()); detailProjectController.getCloud().setSelected(currentProject.isNeedCloud()); detailProjectController.geteMail().setSelected(currentProject.isNeedEMail()); detailProjectController.getAsync().setSelected(currentProject.isNeedAsync()); if (gridPane != null) { mDetail.getChildren().clear(); mDetail.getChildren().add(gridPane); } if (mFields != null && mFields.getItems() != null) { mFields.setItems(null); } } /** * 加载表对象面板 */ private void initTable() { GridPane gridPane = mTableLoader.getRoot(); if (currentTable != null) { detailTableController.getTablename().setText(currentTable.getTableName()); detailTableController.getTablecomment().setText(currentTable.getTableComment()); detailTableController.getCreate().setSelected(currentTable.getCreate()); detailTableController.getDelete().setSelected(currentTable.getDelete()); detailTableController.getUpdate().setSelected(currentTable.getUpdate()); detailTableController.getFind().setSelected(currentTable.getFind()); detailTableController.getGet().setSelected(currentTable.getGet()); detailTableController.getSearch().setSelected(currentTable.getSearch()); detailTableController.getSys().setSelected(currentTable.getSys()); detailTableController.getAjax().setSelected(currentTable.getAjax()); detailTableController.getHtml().setSelected(currentTable.getHtml()); detailTableController.getApi().setSelected(currentTable.getApi()); } if (gridPane != null) { mDetail.getChildren().clear(); mDetail.getChildren().add(gridPane); } ObservableList columns = mFields.getColumns(); columns.get(0).setCellValueFactory(new PropertyValueFactory("fieldName")); columns.get(0).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { param.setOnEditCommit(new EventHandler() { @Override public void handle(TableColumn.CellEditEvent event) { int row = event.getTablePosition().getRow(); Field field = currentTable.getFields().get(row); String newValue = (String) event.getNewValue(); if (mainController.getMcdx().isSelected()) { newValue = Tool.any2Underline(newValue); } field.setFieldName(newValue); if (newValue.toUpperCase().endsWith("_ID")) { field.setFieldType(FieldType.Long.name()); } if (newValue.toUpperCase().endsWith("_TIME") || newValue.toUpperCase().endsWith("_DATE")) { field.setFieldType(FieldType.Date.name()); } if (newValue.toUpperCase().endsWith("_TYPE")) { field.setFieldType(FieldType.Dict.name()); } } }); TextFieldTableCell textFieldTableCell = new TextFieldTableCell(new DefaultStringConverter()) { @Override public void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (currentTable != null) { int index = this.getTableRow().getIndex(); if (index >= 0 && index <= currentTable.getFields().size() - 1) { Field field = currentTable.getFields().get(index); if (field.getIsSystem()) { ignoreField(this); this.setDisable(true); } else { recoveryField(this); this.setDisable(false); } } } } }; textFieldTableCell.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent event) { TableCell source = (TableCell) event.getSource(); Dragboard md = source.startDragAndDrop(TransferMode.ANY); ClipboardContent content = new ClipboardContent(); content.putString((String) source.getItem()); md.setContent(content); // System.out.println("Dragging: " + db.getString()); event.consume(); } }); textFieldTableCell.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard md = event.getDragboard(); if (md.hasString()) { double y = event.getY(); double height = textFieldTableCell.getHeight(); if (y >= height / 4 && y < height * 3 / 4) { event.acceptTransferModes(TransferMode.MOVE); } else { event.acceptTransferModes(TransferMode.COPY); } } // System.out.println("DragOver: " + db.getString()); event.consume(); } }); textFieldTableCell.setOnDragDropped(new EventHandler() { @Override public void handle(DragEvent event) { Dragboard md = event.getDragboard(); String f1 = md.getString(); TableCell source = (TableCell) event.getSource(); String f2 = ((TableCell) event.getGestureTarget()).getText(); if (currentTable != null) { int i1 = 0, i2 = 0; Field t1 = null, t2 = null; for (int i = 0; i < currentTable.getFields().size(); i++) { if (currentTable.getFields().get(i).getFieldName().equals(f1)) { i1 = i; t1 = currentTable.getFields().get(i); } if (currentTable.getFields().get(i).getFieldName().equals(f2)) { i2 = i; t2 = currentTable.getFields().get(i); } } if (event.getTransferMode().equals(TransferMode.COPY)) {//插入 double y = event.getY(); double height = textFieldTableCell.getHeight(); if (y < height / 2) { currentTable.getFields().add(i2, t1); } else { currentTable.getFields().add(i2 + 1, t1); } if (i1 < i2) { currentTable.getFields().remove(i1); } else { currentTable.getFields().remove(i1 + 1); } } else if (event.getTransferMode().equals(TransferMode.MOVE)) {//交换 currentTable.getFields().add(i1, t2); currentTable.getFields().remove(i1 + 1); currentTable.getFields().add(i2, t1); currentTable.getFields().remove(i2 + 1); } } event.setDropCompleted(true); event.consume(); } }); return textFieldTableCell; } }); columns.get(1).setCellValueFactory(new PropertyValueFactory("fieldType")); columns.get(1).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { ObservableList objects = FXCollections.observableArrayList(); Class clz = FieldType.class; for (Object obj : clz.getEnumConstants()) { if (obj instanceof FieldType) { objects.add(obj.toString()); } } ChoiceBoxTableCell choiceBoxTableCell = new ChoiceBoxTableCell(objects) { @Override public void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (currentTable != null) { int index = this.getTableRow().getIndex(); if (index >= 0 && index <= currentTable.getFields().size() - 1) { Field field = currentTable.getFields().get(index); FieldType fieldType = FieldType.parse(field.getFieldType()); if (fieldType.isFix() && fieldType.getDefaultLength() != field.getFieldLength()) { field.setFieldLength(fieldType.getDefaultLength()); mFields.refresh(); } if (field.getIsSystem()) { ignoreField(this); this.setDisable(true); } else { recoveryField(this); this.setDisable(false); } } } } }; param.setOnEditCommit(new EventHandler() { @Override public void handle(TableColumn.CellEditEvent event) { int row = event.getTablePosition().getRow(); Field field = currentTable.getFields().get(row); String fieldType = (String) event.getNewValue(); field.setFieldLength(FieldType.parse(fieldType).getDefaultLength()); field.setFieldType(fieldType); mFields.refresh(); } }); return choiceBoxTableCell; } }); columns.get(2).setCellValueFactory(new PropertyValueFactory("fieldLength")); columns.get(2).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { param.setOnEditCommit(new EventHandler() { @Override public void handle(TableColumn.CellEditEvent event) { int row = event.getTablePosition().getRow(); Field field = currentTable.getFields().get(row); if ("String_var".equals(field.getFieldType().toString()) || "String_super".equals(field.getFieldType().toString())) { try { field.setFieldLength((Integer) event.getNewValue()); } catch (Exception e) { e.printStackTrace(); } } mFields.refresh(); } }); TextFieldTableCell textFieldTableCell = new TextFieldTableCell(new IntegerStringConverter()) { @Override public void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (currentTable != null) { int index = this.getTableRow().getIndex(); if (index >= 0 && index <= currentTable.getFields().size() - 1) { Field field = currentTable.getFields().get(index); if (field.getIsSystem()) { ignoreField(this); this.setDisable(true); } else { recoveryField(this); this.setDisable(false); } } } } }; return textFieldTableCell; } }); columns.get(3).setCellValueFactory(new PropertyValueFactory("defaultValue")); columns.get(3).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { param.setOnEditCommit(new EventHandler() { @Override public void handle(TableColumn.CellEditEvent event) { int row = event.getTablePosition().getRow(); Field field = currentTable.getFields().get(row); field.setDefaultValue((String) event.getNewValue()); } }); return new TextFieldTableCell(new DefaultStringConverter()) { @Override public void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (currentTable != null) { int index = this.getTableRow().getIndex(); if (index >= 0 && index <= currentTable.getFields().size() - 1) { Field field = currentTable.getFields().get(index); if (field.getIsSystem()) { ignoreField(this); this.setDisable(true); } else { recoveryField(this); this.setDisable(false); } } } } }; } }); columns.get(4).setCellValueFactory(new PropertyValueFactory("isPrimaryKey")); columns.get(4).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { DBCheckBoxTableCell checkBoxTableCell = new DBCheckBoxTableCell(); DBCheckBoxTableCell.sCallback sCallback = checkBoxTableCell.new sCallback() { @Override public ObservableValue call(Integer param) { super.call(param); List fields = currentTable.getFields(); if (fields.get(param).getIsSystem()) { checkBoxTableCell.setInvalid(true); } else { checkBoxTableCell.setInvalid(false); } if (fields.get(param).getIsPrimaryKey()) { return new SimpleBooleanProperty(true); } else { return new SimpleBooleanProperty(false); } } }; checkBoxTableCell.setSelectedStateCallback(sCallback); checkBoxTableCell.setOnChangeListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { int param1 = checkBoxTableCell.getParam(); Field field = currentTable.getFields().get(param1); field.setIsPrimaryKey(newValue); } }); return checkBoxTableCell; } }); columns.get(5).setCellValueFactory(new PropertyValueFactory("isMust")); columns.get(5).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { final DBCheckBoxTableCell checkBoxTableCell = new DBCheckBoxTableCell(); DBCheckBoxTableCell.sCallback sCallback = checkBoxTableCell.new sCallback() { @Override public ObservableValue call(Integer param) { super.call(param); List fields = currentTable.getFields(); if (fields.get(param).getIsSystem()) { checkBoxTableCell.setInvalid(true); } else { checkBoxTableCell.setInvalid(false); } if (fields.get(param).getIsMust()) { return new SimpleBooleanProperty(true); } else { return new SimpleBooleanProperty(false); } } }; checkBoxTableCell.setSelectedStateCallback(sCallback); checkBoxTableCell.setOnChangeListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { int param1 = checkBoxTableCell.getParam(); Field field = currentTable.getFields().get(param1); field.setIsMust(newValue); } }); return checkBoxTableCell; } }); columns.get(6).setCellValueFactory(new PropertyValueFactory("isUnique")); columns.get(6).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { final DBCheckBoxTableCell checkBoxTableCell = new DBCheckBoxTableCell(); DBCheckBoxTableCell.sCallback sCallback = checkBoxTableCell.new sCallback() { @Override public ObservableValue call(Integer param) { super.call(param); List fields = currentTable.getFields(); if (fields.get(param).getIsSystem()) { checkBoxTableCell.setInvalid(true); } else { checkBoxTableCell.setInvalid(false); } if (fields.get(param).getIsUnique()) { return new SimpleBooleanProperty(true); } else { return new SimpleBooleanProperty(false); } } }; checkBoxTableCell.setSelectedStateCallback(sCallback); checkBoxTableCell.setOnChangeListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { int param1 = checkBoxTableCell.getParam(); Field field = currentTable.getFields().get(param1); field.setIsUnique(newValue); if (newValue) {// field.setIsQuery(true); } } }); return checkBoxTableCell; } }); columns.get(7).setCellValueFactory(new PropertyValueFactory("isQuery")); columns.get(7).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { final DBCheckBoxTableCell checkBoxTableCell = new DBCheckBoxTableCell(); DBCheckBoxTableCell.sCallback sCallback = checkBoxTableCell.new sCallback() { @Override public ObservableValue call(Integer param) { super.call(param); List fields = currentTable.getFields(); if (fields.get(param).getIsSystem()) { checkBoxTableCell.setInvalid(true); } else { checkBoxTableCell.setInvalid(false); } if (fields.get(param).getIsQuery()) { return new SimpleBooleanProperty(true); } else { return new SimpleBooleanProperty(false); } } }; checkBoxTableCell.setSelectedStateCallback(sCallback); checkBoxTableCell.setOnChangeListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { int param1 = checkBoxTableCell.getParam(); Field field = currentTable.getFields().get(param1); field.setIsQuery(newValue); } }); return checkBoxTableCell; } }); columns.get(8).setCellValueFactory(new PropertyValueFactory("isSearch")); columns.get(8).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { final DBCheckBoxTableCell checkBoxTableCell = new DBCheckBoxTableCell(); DBCheckBoxTableCell.sCallback sCallback = checkBoxTableCell.new sCallback() { @Override public ObservableValue call(Integer param) { super.call(param); List fields = currentTable.getFields(); if (fields.get(param).getIsSystem()) { checkBoxTableCell.setInvalid(true); } else { checkBoxTableCell.setInvalid(false); } if (fields.get(param).getIsSearch()) { return new SimpleBooleanProperty(true); } else { return new SimpleBooleanProperty(false); } } }; checkBoxTableCell.setSelectedStateCallback(sCallback); checkBoxTableCell.setOnChangeListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { int param1 = checkBoxTableCell.getParam(); Field field = currentTable.getFields().get(param1); field.setIsSearch(newValue); } }); return checkBoxTableCell; } }); columns.get(9).setCellValueFactory(new PropertyValueFactory("fieldComment")); columns.get(9).setCellFactory(new Callback() { @Override public TableCell call(TableColumn param) { param.setOnEditCommit(new EventHandler() { @Override public void handle(TableColumn.CellEditEvent event) { int row = event.getTablePosition().getRow(); Field field = currentTable.getFields().get(row); field.setFieldComment((String) event.getNewValue()); } }); return new TextFieldTableCell(new DefaultStringConverter()) { @Override public void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (currentTable != null) { int index = this.getTableRow().getIndex(); if (index >= 0 && index <= currentTable.getFields().size() - 1) { Field field = currentTable.getFields().get(index); if (field.getIsSystem()) { ignoreField(this); this.setDisable(true); } else { recoveryField(this); this.setDisable(false); } } } } }; } }); if (currentTable != null) { ObservableList fields = currentTable.getFields(); mFields.setItems(fields); } } void ignoreField(TableCell tableCell) { tableCell.setTextFill(Color.gray(0.8)); } void recoveryField(TableCell tableCell) { tableCell.setTextFill(Color.BLACK); } /** * 双击目录树编辑处理器 */ private class YEventHandler implements EventHandler { @Override public void handle(TreeView.EditEvent event) { TreeItem treeItem = event.getTreeItem(); int level = getLevel(treeItem); System.out.println("原值:" + event.getOldValue()); System.out.println("现值:" + event.getNewValue()); switch (level) { case 0: {//编辑项目名称 projectManager.getProject().setProjectName((String) event.getNewValue()); loadProject(); } break; case 1: {//编辑模块 Module md = projectManager.findDBByDBName((String) event.getOldValue()); md.setModuleName((String) event.getNewValue()); loadingModule(); } break; case 2: {//编辑对象 TreeItem parent = treeItem.getParent(); Module md = projectManager.findDBByDBName((String) parent.getValue()); Table table = projectManager.findTableByTableName(md, (String) event.getOldValue()); if (table != null) { table.setTableName((String) event.getNewValue()); initTable(); } break; } default: break; } } } /** * 目录树右击菜单处理器 */ private class XEventHandler implements EventHandler { @Override public void handle(Event event) { MenuItem target = (MenuItem) event.getTarget(); String text = target.getText(); Project project = (Project) mTree.getRoot(); TreeItem targetItem = (TreeItem) mTree.getFocusModel().getFocusedItem(); int index = -1; index = mTree.getFocusModel().getFocusedIndex(); if (targetItem == null) { targetItem = (TreeItem) mTree.getSelectionModel().getSelectedItem(); } if (index == -1) { index = mTree.getSelectionModel().getSelectedIndex(); } if (text != null && targetItem != null) { switch (text) { case "向上调整": if (index > 0) { Tool.exchange(projectManager.getProject().getModules(), index - 1, index); Tool.exchange(projectManager.getProject().getChildren(), index - 1, index); } break; case "向下调整": List mds = projectManager.getMds(); if (index < mds.size() - 1) { Tool.exchange(projectManager.getProject().getModules(), index, index + 1); Tool.exchange(projectManager.getProject().getChildren(), index, index + 1); } break; case "新增模块": projectManager.getNewModuleName(); break; case "删除模块": if (targetItem != null && targetItem.getParent() == project) { currentProject.getChildren().remove(targetItem); boolean b = projectManager.removeDBByDBName((String) targetItem.getValue()); if (b) { System.out.println("删除模块" + targetItem.getValue() + "成功!"); } } break; case "新增对象": int level = getLevel(targetItem); switch (level) { case 1: {//对模块右击 System.out.println("模块:" + targetItem.getValue()); Module md = projectManager.findDBByDBName((String) targetItem.getValue()); if (md != null) { Table newTableName = projectManager.getNewTableName(md); targetItem.getChildren().add(newTableName); } } break; case 2: {//对对象右击 TreeItem parent = targetItem.getParent(); System.out.println("对象:" + parent.getValue()); Module md = projectManager.findDBByDBName((String) parent.getValue()); Table newTableName = projectManager.getNewTableName(md); parent.getChildren().add(new TreeItem<>(newTableName.getTableName())); break; } default: break; } break; case "删除对象": level = 0; if (targetItem != null && targetItem.getParent() == project) { level = 0; } else if (targetItem != null && targetItem.getParent().getParent() == project) { level = 1; } switch (level) { case 0: {//对模块右击 System.out.println("模块:" + targetItem.getValue()); Module md = projectManager.findDBByDBName((String) targetItem.getValue()); Table newTableName = projectManager.getNewTableName(md); targetItem.getChildren().add(new TreeItem<>(newTableName.getTableName())); } break; case 1: {//对对象右击 TreeItem parent = targetItem.getParent(); System.out.println("对象:" + parent.getValue()); Module md = projectManager.findDBByDBName((String) parent.getValue()); for (Table table : md.getTables()) { if (table.getTableName().equals(targetItem.getValue())) { md.getTables().remove(table); md.getChildren().remove(targetItem); System.out.println("移除'" + targetItem.getValue() + "'对象成功!"); break; } } break; } default: break; } default: } } else if (text != null && targetItem == null) { switch (text) { case "新增模块": projectManager.getNewModuleName(); break; default: break; } } } } private void updateDbTree(List mds) { TreeItem root = mTree.getRoot(); for (Module md : mds) { TreeItem treeItem = new TreeItem<>(md.getModuleName()); treeItem.setExpanded(true); for (Table table : md.getTables()) { TreeItem tree = new TreeItem<>(table.getTableName()); treeItem.getChildren().add(tree); } root.getChildren().add(treeItem); } } public static void main(String[] args) { launch(args); } }