更新父项';s UI取决于在fxml、java fx中单击子UI
我正在使用javafx创建一个类似sqlyog的应用程序。我的问题是我想添加数据库。无论何时添加,它都应该更新拥有所有其他数据库的树视图。此时会出现CREATEDB对话框,在给出名称和设置其他变量后,允许用户添加数据库。如何找到这棵树?如有任何建议,将不胜感激 SQLTab.java //具有treeview的类,该类包含数据库名称的树项及其在树中的详细信息,即表名、触发器、存储过程等更新父项';s UI取决于在fxml、java fx中单击子UI,java,javafx,javafx-8,Java,Javafx,Javafx 8,我正在使用javafx创建一个类似sqlyog的应用程序。我的问题是我想添加数据库。无论何时添加,它都应该更新拥有所有其他数据库的树视图。此时会出现CREATEDB对话框,在给出名称和设置其他变量后,允许用户添加数据库。如何找到这棵树?如有任何建议,将不胜感激 SQLTab.java //具有treeview的类,该类包含数据库名称的树项及其在树中的详细信息,即表名、触发器、存储过程等 package smartsql.connection.sqleditor; import java.io.
package smartsql.connection.sqleditor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Callback;
import org.springframework.jdbc.core.JdbcTemplate;
import static smartsql.SmartSQL.appContext;
import smartsql.connection.ConnectionDO;
import smartsql.leftpane.CreateDB.CreateDBController;
/**
*
* @author manoj
*/
public class SQLTab extends Tab {
ObservableList<String> lstDatabase;
public TreeView databaseView = new TreeView();
public SQLTab(JdbcTemplate jdbcTemplate) {
try {
System.out.println("inside sqlTAb constructor");
ObservableList<String> lstDatabase = SQLEditorDAO.getDatabaseDetails(jdbcTemplate);
System.out.println("inside treeviewww");
this.lstDatabase = lstDatabase;
ConnectionDO cdo = appContext.getBean(ConnectionDO.class);
TreeItem<String> root = new TreeItem<String>(cdo.getUsername()+"@"+cdo.getHost());
databaseView.getStylesheets().add(getClass().getResource("/smartsql/css/SQLTab.css").toExternalForm());
for (String itemString : lstDatabase) {
System.out.println("addingggg:::" + itemString);
TreeItem<String> database = new TreeItem<String>(itemString);
root.getChildren().add(database);
ObservableList<String> lstTables = SQLEditorDAO.getTableDetails(jdbcTemplate, itemString);
TreeItem<String> table = new TreeItem<String>("Tables");
for (String tableName : lstTables) {
table.getChildren().add(new TreeItem<String>(tableName));
}
database.getChildren().add(table);
//adding for stored procedures
ObservableList<String> lstStoredProcedures = SQLEditorDAO.getStoredProcedureDetails(jdbcTemplate,itemString);
TreeItem<String> storedProcedures = new TreeItem<String>("Stored Procedures");
for (String procedureName : lstStoredProcedures) {
storedProcedures.getChildren().add(new TreeItem<String>(procedureName));
}
database.getChildren().add(storedProcedures);
//adding for triggers
ObservableList<String> lstTriggers = SQLEditorDAO.getTriggersDetails(jdbcTemplate,itemString);
TreeItem<String> triggers = new TreeItem<String>("Triggers");
for (String triggerName : lstStoredProcedures) {
storedProcedures.getChildren().add(new TreeItem<String>(triggerName));
}
database.getChildren().add(triggers);
//adding for triggers
ObservableList<String> lstEvents = SQLEditorDAO.getEventsDetails(jdbcTemplate,itemString);
TreeItem<String> events = new TreeItem<String>("Events");
for (String eventName : lstStoredProcedures) {
storedProcedures.getChildren().add(new TreeItem<String>(eventName));
}
database.getChildren().add(events);
}
databaseView.setRoot(root);
databaseView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
}
});
setContent(databaseView);
} catch (Exception e) {
e.printStackTrace();
}
}
private final class TextFieldTreeCellImpl extends TreeCell<String>{
private ContextMenu addMenu = new ContextMenu();
private TextField textField;
public TextFieldTreeCellImpl() {
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
// if the item is not empty and is a root...
if (!empty && getTreeItem().getParent() == null) {
MenuItem addMenuItem = new MenuItem("Create Database");
// addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
System.out.print( "item text is : "+getText());
if(getText().contains("@")){
//TreeItem newEmployee =
// new TreeItem<String>("Create Database");
// getTreeItem().getChildren().add(newEmployee);
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/smartsql/leftpane/CreateDB/CreateDB.fxml"));
Parent node =fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle("Create Database");
stage.setScene(new Scene(node));
stage.initStyle(StageStyle.UTILITY);
stage.resizableProperty().setValue(Boolean.FALSE);
stage.show();
} catch (IOException ex) {
Logger.getLogger(SQLTab.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
// CreateDBController a= appContext.getBean(CreateDBController.class);
// Update u = appContext.getBean(Update.class);
// if(u.name!=null)
// System.out.print("newly added name: "+u.name);
addMenu.getItems().clear();
new TreeItem<String>();
// getTreeItem().getChildren().add(newEmployee);
addMenu.getItems().add(addMenuItem);
setContextMenu(addMenu);
}
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(getTreeItem().getGraphic());
if (
!getTreeItem().isLeaf()&&getTreeItem().getParent()!= null
){
MenuItem addMenuItem = new MenuItem("Create Database1");
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
System.out.print( "item text is : "+getText());
if(getText().contains("@")){
TreeItem newEmployee =
new TreeItem<String>("Create Database");
getTreeItem().getChildren().add(newEmployee);
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/smartsql/leftpane/CreateDB/CreateDB.fxml"));
Parent node =fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle("Create Database");
stage.setScene(new Scene(node));
stage.initStyle(StageStyle.UTILITY);
stage.resizableProperty().setValue(Boolean.FALSE);
stage.show();
} catch (IOException ex) {
Logger.getLogger(SQLTab.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
addMenu.getItems().clear();
addMenu.getItems().add(addMenuItem);
setContextMenu(addMenu);
}
if (
getTreeItem().isLeaf()&&getTreeItem().getParent()!= null
){
MenuItem addMenuItem = new MenuItem("Create Database2");
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
System.out.print( "item text is : "+getText());
if(getText().contains("@")){
TreeItem newEmployee =
new TreeItem<String>("Create Database");
getTreeItem().getChildren().add(newEmployee);
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/smartsql/leftpane/CreateDB/CreateDB.fxml"));
Parent node =fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle("Create Database");
stage.setScene(new Scene(node));
stage.initStyle(StageStyle.UTILITY);
stage.resizableProperty().setValue(Boolean.FALSE);
stage.show();
} catch (IOException ex) {
Logger.getLogger(SQLTab.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
addMenu.getItems().clear();
addMenu.getItems().add(addMenuItem);
setContextMenu(addMenu);
}
}
}
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
private void createTextField() {
textField = new TextField(getString());
textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
});
}
}
}
包smartsql.connection.sqleditor;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javafx.collections.ObservableList;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.fxml.fxmloader;
导入javafx.scene.Node;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.MenuItem;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TreeCell;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.stage.model;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
导入javafx.util.Callback;
导入org.springframework.jdbc.core.jdbc模板;
导入静态smartsql.smartsql.appContext;
导入smartsql.connection.ConnectionDO;
导入smartsql.leftpane.CreateDB.CreateDBController;
/**
*
*@作者manoj
*/
公共类SQLTab扩展选项卡{
可观测数据库;
public TreeView databaseView=new TreeView();
公共SQLTab(JdbcTemplate JdbcTemplate){
试一试{
System.out.println(“内部sqlTAb构造函数”);
ObservableList lstDatabase=SQLEditorDAO.getDatabaseDetails(jdbcTemplate);
System.out.println(“内部树视图www”);
this.lstDatabase=lstDatabase;
ConnectionDO cdo=appContext.getBean(ConnectionDO.class);
TreeItem root=newtreeitem(cdo.getUsername()+“@”+cdo.getHost());
databaseView.getStylesheets().add(getClass().getResource(“/smartsql/css/SQLTab.css”).toExternalForm());
用于(字符串项字符串:lstDatabase){
System.out.println(“addingggg::”+itemString);
TreeItem数据库=新的TreeItem(itemString);
root.getChildren().add(数据库);
ObservableList lstTables=SQLEditorDAO.getTableDetails(jdbcTemplate,itemString);
TreeItem表格=新的TreeItem(“表格”);
for(字符串表名:lstTables){
table.getChildren().add(新的TreeItem(tableName));
}
database.getChildren().add(表);
//为存储过程添加
ObservableList lstStoredProcedures=SQLEditorDAO.getStoredProcedureDetails(jdbcTemplate,itemString);
TreeItem storedProcedures=新的TreeItem(“存储过程”);
for(字符串过程重命名:lstStoredProcedures){
storedProcedures.getChildren().add(新的TreeItem(procedureName));
}
database.getChildren().add(存储过程);
//添加触发器
ObservableList lstTriggers=SQLEditorDAO.getTriggersDetails(jdbcTemplate,itemString);
TreeItem触发器=新的TreeItem(“触发器”);
for(字符串触发器名称:lstStoredProcess){
storedProcedures.getChildren().add(新的TreeItem(triggerName));
}
database.getChildren().add(触发器);
//添加触发器
ObservableList lstEvents=SQLEditorDAO.getEventsDetails(jdbcTemplate,itemString);
TreeItem事件=新的TreeItem(“事件”);
for(字符串事件名称:lststoredprocesses){
storedProcedures.getChildren().add(新树项(eventName));
}
database.getChildren().add(事件);
}
databaseView.setRoot(root);
databaseView.setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
返回新的TextFieldTreeCellImpl();
}
});
setContent(数据库视图);
}捕获(例外e){
e、 printStackTrace();
}
}
私有最终类TextFieldTreeCellImpl扩展了TreeCell{
private ContextMenu addMenu=新建ContextMenu();
私有文本字段文本字段;
公共文本字段treecellimpl(){
}
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
//如果项目不是空的并且是根目录。。。
如果(!empty&&getTreeItem().getParent()==null){
MenuItem addMenuItem=新建MenuItem(“创建数据库”);
//addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(新的EventHandler(){
公共无效句柄(事件t){
System.out.print(“项目文本为:+getText());
如果(getText()包含“@”){
//TreeItem新员工=
//新建树项(“创建数据库”);
//getTreeItem().getChildren().add(新员工);
试一试{
FXMLLoader FXMLLoader=新的FXMLLoader(getClass().getResource(“/smartsql/leftpane/CreateDB/CreateDB.fxml”);
父节点=fxmloader.load();
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="smartsql.leftpane.CreateDB.CreateDBController">
<stylesheets>
<URL value="@createdb.css"/>
</stylesheets>
<children>
<GridPane layoutX="14.0" layoutY="15.0" prefHeight="20.0" prefWidth="500.0" >
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="120.0" minWidth="100.0" prefWidth="175.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="128.0" minWidth="100.0" prefWidth="175.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="10.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Database Name" GridPane.rowIndex="1" >
</Label>
<Label text="Database Charset" GridPane.rowIndex="2"/>
<Label text="Database Collation" GridPane.rowIndex="3"/>
<TextField fx:id="txtDatabaseName" promptText="Database Name" GridPane.columnIndex="1">
</TextField>
<ChoiceBox fx:id="txtCharset" prefWidth="500.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
</ChoiceBox>
<ChoiceBox fx:id="txtCollation" prefWidth="500.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
</ChoiceBox>
<Button fx:id="createDatabase" minWidth="-Infinity" mnemonicParsing="false" onAction="#handleNewDatabase" text="Create" prefWidth="70.0" GridPane.rowIndex="4" GridPane.columnIndex="1" />
<Button fx:id="cancel" minWidth="-Infinity" mnemonicParsing="false" onAction="#handleCancel" prefWidth="70.0" text="Cancel" GridPane.columnIndex="2" GridPane.rowIndex="4" />
</children>
</GridPane>
</children>
</AnchorPane>
package smartsql.leftpane.CreateDB;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import org.springframework.jdbc.core.JdbcTemplate;
import static smartsql.SmartSQL.appContext;
import smartsql.connection.ConnectionDO;
import smartsql.connection.MySQLConnectionController;
import smartsql.connection.MySQLConnectionManager;
import smartsql.connection.sqleditor.SQLEditor;
import smartsql.connection.sqleditor.SQLEditorDAO;
import smartsql.connection.sqleditor.SQLTab;
import smartsql.connection.sqleditor.Update;
public class CreateDBController extends MySQLConnectionController implements Initializable {
/**
* Initializes the controller class.
*/
@FXML
ChoiceBox txtCharset;
@FXML
ChoiceBox txtCollation;
@FXML
TextField txtDatabaseName;
@FXML
Button createDatabase;
@FXML
Button cancel;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
ConnectionDO cdo = appContext.getBean(ConnectionDO.class);
Update update = appContext.getBean(Update.class);
update.bindName(txtDatabaseName.textProperty());
MySQLConnectionManager connManager = appContext.getBean(MySQLConnectionManager.class);
JdbcTemplate jdbcTemplate;
try {
jdbcTemplate = connManager.connect(cdo);
ObservableList<String> charset = CreateDBDAO.getCharset(jdbcTemplate);
txtCharset.setItems((ObservableList) charset);
txtCharset.getItems().add("[default]");
txtCharset.getSelectionModel().selectLast();
ObservableList<String> collation = CreateDBDAO.getCollation(jdbcTemplate);
txtCollation.setItems(collation);
txtCollation.getItems().add("[default]");
txtCollation.getSelectionModel().selectLast();
} catch (Exception ex) {
Logger.getLogger(CreateDBController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@FXML
private void handleNewDatabase(ActionEvent even) {
Stage stage = (Stage)createDatabase.getScene().getWindow();
ConnectionDO cdo = appContext.getBean(ConnectionDO.class);
MySQLConnectionManager connManager = appContext.getBean(MySQLConnectionManager.class);
JdbcTemplate jdbcTemplate;
try {
jdbcTemplate = connManager.connect(cdo);
String dbName=txtDatabaseName.getText();
CreateDBDAO.createDatabase(dbName,jdbcTemplate);
stage.close();
}catch(Exception e){
e.printStackTrace();
}
}
@FXML
private void handleCancel() {
Stage stage = (Stage)cancel.getScene().getWindow();
stage.close();
}
// public String getDatabaseName(){
// if(txtDatabaseName.getText()!=null)
// return txtDatabaseName.getText();
// else return " s";
// }
}
stage.show();
stage.showAndWait() ;
CreateDBController controller = fxmlLoader.getController();
Optional<String> db = controller.getDatabaseName();
db.ifPresent(dbName -> {
// do whatever you need with dbName, e.g.
databaseView.getRoot().getChildren().add(new TreeItem<>(dbName));
});
public class CreateDBController ... {
private Optional<String> databaseName ;
// ... other code as before
@FXML
private void handleNewDatabase(ActionEvent even) {
Stage stage = (Stage)createDatabase.getScene().getWindow();
ConnectionDO cdo = appContext.getBean(ConnectionDO.class);
MySQLConnectionManager connManager = appContext.getBean(MySQLConnectionManager.class);
JdbcTemplate jdbcTemplate;
try {
jdbcTemplate = connManager.connect(cdo);
String dbName=txtDatabaseName.getText();
CreateDBDAO.createDatabase(dbName,jdbcTemplate);
databaseName = Optional.of(dbName);
stage.close();
}catch(Exception e){
e.printStackTrace();
}
}
@FXML
private void handleCancel() {
Stage stage = (Stage)cancel.getScene().getWindow();
databaseName = Optional.empty();
stage.close();
}
public Optional<String> getDatabaseName() {
return databaseName ;
}
}