- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 JavaFX 中执行此程序,该程序将从 Microsoft Access 创建的数据库中获取数据并将其放置在 TableView 中。另外,我在 TableView 内创建了按钮(添加、删除),当单击添加按钮时,它将打开一个新的 FXML 页面。在此页面中有 5 个 TextFiled 和两个按钮(添加和取消),当单击添加按钮时,它会获取 TextFiled 中的所有数据并将其添加到我的 TableView 中。但我实际上做不到。我希望这里有人知道我如何实现这一目标。
FXMLDocumentController.java
package db;
import java.net.URL;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.util.Callback;
/**
*
* @author pc
*/
public class FXMLDocumentController implements Initializable {
@FXML
public Statement st;
public TableView<ObservableList> table;
public ObservableList<ObservableList> data;
private Button btnNew = new Button("New Record");
public void buildData(){
data = FXCollections.observableArrayList();
try{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection con = DriverManager.getConnection("jdbc:ucanaccess://D:\\GUI\\Library.accdb","","");
System.out.println("connected...");
st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//SQL FOR SELECTING ALL OF BOOK
String SQL = "SELECT * from BookDB";
//ResultSet
ResultSet rs = con.createStatement().executeQuery(SQL);
/**********************************
* TABLE COLUMN ADDED DYNAMICALLY *
**********************************/
for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
//We are using non property style for making dynamic table
final int j = i;
TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
table.getColumns().addAll(col);
System.out.println("Column ["+i+"] ");
}
TableColumn col_action = new TableColumn<>("Action");
col_action.setSortable(false);
col_action.setCellValueFactory(
new Callback<TableColumn.CellDataFeatures<ObservableList, Boolean>,
ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ObservableList, Boolean> p) {
return new SimpleBooleanProperty(p.getValue() != null);
}
});
col_action.setCellFactory(
new Callback<TableColumn<ObservableList, Boolean>, TableCell<ObservableList, Boolean>>() {
@Override
public TableCell<ObservableList, Boolean> call(TableColumn<ObservableList, Boolean> p) {
return new ButtonCell(table);
}
});
table.getColumns().add(col_action);
TableColumn col_Delete = new TableColumn<>("Delete");
col_Delete.setSortable(false);
col_Delete.setCellValueFactory(
new Callback<TableColumn.CellDataFeatures<ObservableList, Boolean>,
ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ObservableList, Boolean> p) {
return new SimpleBooleanProperty(p.getValue() != null);
}
});
col_Delete.setCellFactory(
new Callback<TableColumn<ObservableList, Boolean>, TableCell<ObservableList, Boolean>>() {
@Override
public TableCell<ObservableList, Boolean> call(TableColumn<ObservableList, Boolean> p) {
return new ButtonDelete(table);
}
});
table.getColumns().add(col_Delete);
/********************************
* Data added to ObservableList *
********************************/
while(rs.next()){
//Iterate Row
ObservableList<String> row = FXCollections.observableArrayList();
for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
//Iterate Column
row.add(rs.getString(i));
}
System.out.println("Row [1] added "+row );
data.add(row);
}
//FINALLY ADDED TO TableView
table.setItems(data);
}
catch(Exception e){
e.printStackTrace();
System.out.println("Error on Building Data");
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
buildData();
table.refresh();
}
//Define the button cell
private class ButtonCell extends TableCell<ObservableList, Boolean> {
final Button cellButton = new Button("Add");
ButtonCell(final TableView tblView){
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
try {
Second s=new Second();
s.start(new Stage());
} catch (Exception ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
//Display button if the row is not empty
@Override
protected void updateItem(Boolean t, boolean empty) {
super.updateItem(t, empty);
if(!empty){
setGraphic(cellButton);
}
}
}
//Define the button cell
private class ButtonDelete extends TableCell<ObservableList, Boolean> {
final Button delButton = new Button("Delete");
ButtonDelete(final TableView tblView){
delButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
Stage myDialog = new Stage();
myDialog.initModality(Modality.WINDOW_MODAL);
myDialog.show();
}
});
}
//Display button if the row is not empty
@Override
protected void updateItem(Boolean t, boolean empty) {
super.updateItem(t, empty);
if(!empty){
setGraphic(delButton);
}
}
}
}
FXMLController.java
package db;
import java.net.URL;
import java.sql.Statement;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
/**
* FXML Controller class
*
* @author pc
*/
public class FXMLController implements Initializable {
@FXML
public TextField t1,t2,t3,t4,t5;
public Statement st;
@FXML
public void btnADD(ActionEvent e)
{
}
@FXML
public void btnCANCEL(ActionEvent e)
{
System.exit(0);
}
@Override
public void initialize(URL url, ResourceBundle rb)
{
}
}
数据库结构
最佳答案
创建弹出窗口时,向其传递一个回调方法,以保留数据并刷新表。单击“添加”按钮时,弹出窗口应调用消费者。这是加载弹出窗口的示例:
// This method should be called with the table's 'Add' buttons are clicked
public void addButtonClicked() {
try{
// Load the popup
FXMLLoader loader = new FXMLLoader(getClass().getResource("Popup.fxml"));
loader.load();
PopupController controller = loader.getController();
Parent popup = loader.getRoot();
// Give popup a callback method
controller.setup(
(value)->{data.add(value);table.refresh();}
);
// Display popup
Stage stage = new Stage();
stage.setScene(new Scene(popup));
stage.show();
} catch(IOException ex) {
// ToDo: Handle failed popup
}
}
<小时/>
这是一个完整的工作示例,其中包含主应用程序以及弹出 fxml 和 Controller :
JavaFxApplication.java
import java.io.IOException;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFXApplication20 extends Application {
// Data for the table
private ObservableList<String> data = FXCollections.observableArrayList(
"Item 1","Object 2","Thing 3","Product 4"
);
// The table
private TableView<String> table = new TableView<>(data);
@Override
public void start(Stage stage) throws Exception {
// Content Column
TableColumn<String,String> contentCol = new TableColumn<>("Content");
contentCol.setCellValueFactory(p->new ReadOnlyObjectWrapper(p.getValue()));
// Action Column
TableColumn actionCol = new TableColumn("Action");
actionCol.setCellFactory(param-> new TableCell<String, String>() {
final Button btn = new Button("Add");
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
setText(null);
} else {
// Make sure the column of 'Add' buttons
// call the right method
btn.setOnAction(event->addButtonClicked());
setGraphic(btn);
setText(null);
}
}
});
// Display everything on the stage
table.getColumns().addAll(contentCol,actionCol);
Scene scene = new Scene(new VBox(table));
stage.setScene(scene);
stage.show();
}
public void addButtonClicked() {
try{
// Load the popup
FXMLLoader loader = new FXMLLoader(getClass().getResource("Popup.fxml"));
loader.load();
PopupController controller = loader.getController();
Parent popup = loader.getRoot();
// Give popup a callback method
controller.setup(
(value)->{data.add(value);table.refresh();}
);
// Display popup
Stage stage = new Stage();
stage.setScene(new Scene(popup));
stage.show();
} catch(IOException ex) {
// ToDo: Handle failed popup
}
}
public static void main(String[] args) {
launch(args);
}
}
Popup.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:controller="javafxapplication20.PopupController">
<children>
<Button fx:id="button" layoutX="126" layoutY="90" onAction="#addButtonAction" text="Add" />
<Label fx:id="label" layoutX="122.0" layoutY="62.0" minHeight="16" minWidth="69" text="Hello World" />
</children>
</AnchorPane>
PopupController.java
import java.net.URL;
import java.util.ResourceBundle;
import java.util.function.Consumer;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
public class PopupController implements Initializable {
@FXML
private Label label;
@FXML
private Button button;
private Consumer<String> callback;
@Override
public void initialize(URL url, ResourceBundle rb) {
// ToDo: Initialize something
}
public void setup(Consumer<String> callback) {
this.callback = callback;
}
@FXML
private void addButtonAction(ActionEvent event) {
callback.accept(label.getText());
}
}
关于java - 单击另一个页面上的按钮时如何将数据添加到 TableView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660241/
所以我有这个 javascript 片段,它有两个按钮可以进入全屏,一个按钮可以退出全屏。我想做到这一点,如果我不在全屏模式下,按钮会显示转到全屏模式,而当我处于全屏模式时,按钮会显示退出全屏模式..
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我尝试将 Twitter 上的“Tweet Me”按钮 ( http://twitter.com/goodies/tweetbutton ) 添加到我的网站。然而,每当按下按钮时,我都会收到此 Jav
我试图在我的文本区域中获取一个按钮值,如果我使用 则工作正常但如果我使用那么它就不起作用了。你能找出问题所在吗? HTML 1 2 3 4 JavaScript $(document).read
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个表单,其中过滤器下方有按钮(应用过滤器和清除过滤器),我试图在单击“应用”按钮时显示“清除”,并在单击“清除”按钮时隐藏“清除”按钮。 下面的代码(如果我的表有的话):
excel 按钮正在工作,但是当我添加 pdf 按钮时,它添加仅显示 pdf 按钮 excel 按钮在 pdf 按钮添加后隐藏 $(document).ready(function() { $
我想创建一个 div 作为标题并分成 3 列,并按以下顺序在其中放置 2 个按钮和一个标题:Button1(左位) Title(居中) Button2(右位) 这是我为这个 div 编写的代码:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如您所知,您可以使用 2 种方法在 HTML5 中呈现按钮: 使用 void 元素 或 如果您需要内容,请使用 元素(不是空元素)。 在JSF2中,有2种方式生成按钮;与UICommand或 UIOu
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我有用于在消息(电子邮件、短信)上输入内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码: message.setOnEditorActionList
我的 Android 应用程序中有一堆 EditText,每个都将 InputMethod 设置为 numberSigned。我的目标设备没有硬件键盘,而是使用软件键盘输入数字。 Android 将输
我无法以编程方式隐藏弧形菜单中的 fab 按钮。我正在使用https://github.com/saurabharora90/MaterialArcMenu在我的代码中。如何在Java中以编程方式隐藏
我已经看到这在其他类型的对话框窗口中是可能的,例如“showConfirmDialog”,其中可以指定按钮的数量及其名称;但是使用“showInputDialog”时是否可以实现相同的功能?我似乎无法
相同的按钮用于激活和停用。第一次,当代码运行按钮单击并成功“停用”时。但第二次,代码无法找到该元素。第一个案例按钮位于第二个“a”标签中,然后停用第一个“a”标签中的按钮。 案例1: Edit
是否可以将按钮的 onclick 操作设置为 JavaScript 变量?这个想法是我们用 JavaScript 控制一个表。每当点击该表的一行时,我们就会更新一个 JavaScript 变量。该 v
我想创建一个按钮,它包含左侧的文本和右侧的复选框(或任何其他组件)。我怎样才能做到这一点? 我发现我可以制作自己的 View extends Button,但是如果可以的话我应该如何实现 onDraw
我是一名优秀的程序员,十分优秀!