- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我是 MooTools 的新手。我注意到 Morph 效果类似于 Tween 效果。 唯一的区别是 tween 用于一个属性,而 morph 用于多个属性。 有人能告诉我这些效果最适合做什么吗,即一种
和有什么区别和 ?我是否需要两者,或者其中一个是另一个的新替代品? 最佳答案 脚本是将一些 AS3 代码放入 MXML 类中的地方。声明是一种将 MXML 中定义的公共(public)属性放在类上的
您好,我有一个可以在 GUI(Java FX)和命令行上运行的应用程序。当作为 GUI 运行时,我在文本区域显示状态。这工作得很好。 但问题是,当我尝试显示来自某个不同(非 javafx)类的错误(通
我正在为我的局域网应用程序创建包含日志的表。当我尝试运行此应用程序时,它抛出 NullPointerException,但 fx:id 和 fx:controller 是正确的。我正在使用 JavaF
我想将纹理应用于自定义形状。我认为这会起作用: .myTextureShape { -fx-shape: "M0 0 L0 50 L25 25 L50 50 L50 0 Z"; -fx-backgro
我正在使用 JavaFX,我想自定义一个按钮。我看到了几个可以设计样式的特征。其中我发现了两个我不认识的。 .button { -fx-padding: 5 22 5 22; -f
我想在一秒钟内淡入一个节点。然后保持 10 秒钟。然后 fadeOut 再持续 3 秒。一种链接方式如下: dojo.fx.chain([ dojo.fadeIn({node:myNode, d
我是 Java Fx 的真正初学者,并且在将我在网络上找到的两个 png 文件加载到我的应用程序中时遇到问题。有人可以告诉我可能出了什么问题吗?下面是我正在使用的代码: Button fBut
在 JavaFX CSS 中,一个 Label 似乎有 2 个 CSS 填充属性。 Label具有 Labeled 的所有属性, 在这之下我们有 -fx-label-padding. 但是,Label
由于我的规则已经到位,但这些错误很流畅。我试图了解网络上可用的解决方案,但没有一个对我有用。 Jul 18, 2016 1:39:17 PM javafx.scene.CssStyleHelper c
afterburner.fx for JavaFX 8 是一个简约的(3 类)JavaFX MVP 框架,基于配置约定和依赖注入(inject),由亚当·比恩。 afterburner.fx 使用 M
更新: 我发现问题出在 Inno Setup 上。安装程序正在创建,但 Inno Setup 会自动尝试运行需要管理员权限的安装程序。由于未授予这些权限,因此安装程序失败。 如果我将权限授予使用 In
我可以在我的IntelliJ项目中包含Controsfx,但我不能运行该程序。我也尝试了另一种解决方案:将此添加到VM选项中。当我运行该程序时,它出现运行时错误:
I could include the controlsfx into my project in IntelliJ but I can't run the program.I also alr
我想通过鼠标拖动或缩放按钮实现实时折线图的放大功能(图表每 50 毫秒移动一次)。我想放大特定区域..但是我面临的问题是每次图形中的(x,y)坐标值发生变化时。有什么办法可以放大这个图表吗? Java
我进行了搜索,但找不到任何与我在 Fx 中遇到的问题相近的内容。我正在使用 Java Fx/JDK 8,并且在调整场景大小时遇到问题。下面的代码在场景图中一次仅加载一个屏幕,并在屏幕之间切换。问题
在我的程序中,我必须通过单击单选按钮来更改示例字符串的颜色。但每次我点击它们时我都会收到错误。我不断收到此错误。我还使用 e(fx)clipse 来对此进行编码。 Caused by: java.la
更新 2019.05.14 4:54PM EST - 好的 - 这是说明我的问题的代码 - 可能花了我太长时间才得到这个,而且可能太长了,但同样,我是 Java 新手。无论如何 - 它有效,打开表单,
我有一个 FX 应用程序,从一开始,它就开始播放音乐,这很有效。现在我希望当我打开一个方法来在其上播放另一个声音时。 我将第二个声音编码为第一个,但它不起作用。我尝试创建一个新的Thread,但没有改
我最近正在使用 blob 图像进行图像上传,并且它有效但现在当我尝试在搜索中搜索特定的人时,它没有显示我试图将 blob 图像转换为字节并以 java fx 形式显示在图像字段中 这是我的代码 @F
我是一名优秀的程序员,十分优秀!