如何在JavaFX 2.0中的其他屏幕TextField上填充TableView数据

时间:2012-05-24 09:25:11

标签: tableview textfield javafx-2

我在将数据从一个屏幕中的表格填充到另一个屏幕中的文本字段时遇到问题。我有两个类FirstClass包含一个文本框和一个按钮。按下按钮时,将打开包含值表的第二个窗口。当用户双击一行时,该行的第二列的值应该插入到FirstClass的文本框中。附上两个类的代码。在期待中感谢你。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class FirstClass extends Application {
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(final Stage primaryStage) {
    primaryStage.setTitle("First Class");

    GridPane gridpane = new GridPane();
    gridpane.setPadding(new Insets(5));
    gridpane.setHgap(5);
    gridpane.setVgap(5);

    final TextField userNameFld = new TextField();
    gridpane.add(userNameFld, 1, 1);
    Button btn = new Button();
    btn.setText("Show Table");
    gridpane.add(btn, 1, 3);

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            String a = TableClass.showDialog(primaryStage, true, "Table Window" );
            userNameFld.setText(a);
        }
    });

    StackPane root = new StackPane();

    Scene scene =new Scene(root, 300, 250);

    root.getChildren().addAll(gridpane);
    primaryStage.setScene(scene);
    primaryStage.show();
 }
}







import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class TableClass extends Stage {

private static TableClass dialog;
private static String value = "";


public static class Person {
    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;


    private Person(String fName, String lName) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
    }

    public String getFirstName() {
        return firstName.get();
    }
    public void setFirstName(String fName) {
        firstName.set(fName);
    }

    public String getLastName() {
        return lastName.get();
    }
    public void setLastName(String fName) {
        lastName.set(fName);
    }
}


 private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data = 
        FXCollections.observableArrayList(
            new Person("JACK", "BROWN"),
            new Person("JOHN", "VIANNEYS"),
            new Person("MICHAEL", "NELSON"),
            new Person("WILLIAM", " CAREY")
        );


public TableClass(Stage owner, boolean modality, String title) {
    super();
    initOwner(owner);
    Modality m = modality ? Modality.APPLICATION_MODAL : Modality.NONE;
    initModality(m);
    setOpacity(1);
    setTitle(title);

    StackPane root = new StackPane();

    Scene scene = new Scene(root, 750, 750);

    setScene(scene);
    GridPane gridpane = new GridPane();
    gridpane.setPadding(new Insets(5));
    gridpane.setHgap(5);
    gridpane.setVgap(5);


    TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setMinWidth(100);
    firstNameCol.setCellValueFactory(
    new PropertyValueFactory<Person,String>("firstName")
    );

    TableColumn lastNameCol = new TableColumn("Last Name");
    lastNameCol.setMinWidth(200);
    lastNameCol.setCellValueFactory(
    new PropertyValueFactory<Person,String>("lastName")
    );



    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol);



    table.setOnMouseClicked(new EventHandler<MouseEvent>() {

           public void handle(MouseEvent me) {

                   if (me.getClickCount() >= 2) {
                       String  srr = table.getItems().get    (table.getSelectionModel().getSelectedIndex()).getLastName();
                       value = srr;
                       dialog.hide();
                      }
               }
        });


    gridpane.add(table, 1, 5,1,20 );
    root.getChildren().add(gridpane);
    }


public static String showDialog(Stage stg, Boolean a , String title){
      dialog = new TableClass( stg,a, title);
      dialog.show();
      return value;
  }
 }

1 个答案:

答案 0 :(得分:1)

快速简便的方法(但它引入了两个类之间的耦合)是将userNameFld传递给showDialog方法并使其成为TableClass的成员。然后,您可以从TableClass类更改其值。

更好的方法是userNameFld value到{{1}}。