2017-05-16 12 views
0

多くの例で、TableViewにボタンを追加する方法が見つかりましたが、どれもfxmlの使用方法を示していません。 Hereは、私はだから私はfxmlを作成しようとしたfxmlFXMLを使用してTableViewにボタンを追加するには?

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 

public class GestureEvents extends Application { 
    private TableView<Person> table = new TableView<>(); 
    private final ObservableList<Person> data = 
     FXCollections.observableArrayList(
      new Person("Jacob", "Smith"), 
      new Person("Isabella", "Johnson"), 
      new Person("Ethan", "Williams"), 
      new Person("Emma", "Jones"), 
      new Person("Michael", "Brown") 
     ); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     final Label label = new Label("Friends"); 
     label.setFont(new Font("Arial", 20)); 

     final Label actionTaken = new Label(); 

     TableColumn<Person, Person> unfriendCol = new TableColumn<>("Anti-social"); 
     unfriendCol.setMinWidth(40); 
     unfriendCol.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue())); 
     unfriendCol.setCellFactory(param -> new TableCell<Person, Person>() { 
      private final Button deleteButton = new Button("Unfriend"); 

      @Override 
      protected void updateItem(Person person, boolean empty) { 
       super.updateItem(person, empty); 

       if (person == null) { 
        setGraphic(null); 
        return; 
       } 

       setGraphic(deleteButton); 
       deleteButton.setOnAction(event -> data.remove(person)); 
      } 
     }); 

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

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

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

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.setPadding(new Insets(10, 10, 10, 10)); 
     vbox.getChildren().addAll(label, table, actionTaken); 
     VBox.setVgrow(table, Priority.ALWAYS); 

     stage.setScene(new Scene(vbox)); 
     stage.show(); 
    } 

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

に変換しようとしているテストコードの一つです。しかし、fxmlの "ボタン"フィールドの指定方法はわかりません。

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.SplitPane?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.VBox?> 

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.PersonTableController"> 
    <center> 
     <SplitPane BorderPane.alignment="CENTER"> 
     <items> 
      <VBox prefHeight="200.0" prefWidth="100.0"> 
       <children> 
        <Label text="Main Table" /> 
        <TextField fx:id="filterField" /> 
        <TableView fx:id="personTable" prefHeight="200.0" prefWidth="200.0"> 
        <columns> 
         <TableColumn fx:id="firstNameColumn" onEditStart="#initialize" prefWidth="75.0" text="C1" /> 
         <TableColumn fx:id="lastNameColumn" onEditStart="#initialize" prefWidth="75.0" text="C2" /> 
        </columns> 
        </TableView> 
       </children> 
      </VBox> 
     </items> 
     </SplitPane> 
    </center> 
</BorderPane> 
+0

をあなたはFXMLと直接これを行うことはできません、セルファクトリが必要なためです。コントローラのセルファクトリを設定するだけです。 –

+0

ありがとうございました。しかし、fxmlのボタン列について言及していない場合、シーンビルダーには表示されません –

+0

FXMLで列を定義している(つまり、シーンビルダで列を作成しています)、そこではセルファクトリを作成できません(Scene Builderのボタンは表示されませんが、問題はありません)。通常の方法で列を作成し、コントローラにセルファクトリを設定します。 –

答えて

0

のためのコードは、使用することができますFXMLファイル内のボタンを含める:

<Button fx:id="buttonId" text="Ok" onMouseClicked="#onMouseClickedEvent"/> 

を現在より多くの情報を見つけることができます。 Using FXML to Create a User Interface

+0

これは本当のことですが、この質問とは何が関係していますか? –

関連する問題