gpt4 book ai didi

java - 根据 fxml、java fx 中子 UI 的点击更新父级 UI

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:28 26 4
gpt4 key购买 nike

我正在使用 javafx 创建一个像 sqlyog 这样的应用程序。我的问题是我想添加数据库。无论何时添加,它都应该更新具有所有其他数据库的 TreeView 。出现创建数据库的对话框,给出名称并设置其他变量后,它让用户添加数据库。如何获得这个treeView?任何建议将不胜感激。

SQLTab.java//具有 TreeView 的类,其中包含数据库名称的树项及其在树中的详细信息,即表名称、触发器、存储过程等。

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();
}
}
});
}
}


}

CreateDB.fxml正在获取数据库名称

<?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>

CreateDBController.java

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";
// }
}

我想更新那个 TreeView 。

最佳答案

当您显示包含 CreateDB.fxml 的对话框时(我在代码中看到了三次),而不是

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));
});

这将阻止执行,直到对话框被关闭(即用户按确定或取消)。然后您将获得对 Controller 的引用并从中检索数据。使用Optional为您提供了一种在用户取消的情况下处理“无值”的便捷方法。

然后在CreateDBController中定义一个databaseName字段。在 handleNewDatabase 方法中将其设置为用户提供的值,并在 handleCancel 方法中将其设置为空:

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 ;
}
}

关于java - 根据 fxml、java fx 中子 UI 的点击更新父级 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com