2017-01-02 4 views
0

msアクセスのようなグリッドペインを使用して連続フォームを作成するための助けが必要です。最初はグリッド区画に1行3列がありますJavaFX連続フォームは、グリッドペインにコンテンツを含む新しい行を動的に追加します。

|チョイスボックス|削除ボタン|追加ボタン|

>> screenshot initial gridpane

public class myGridpane { 

    @FXML 
    private GridPane gp_form; 
    private List<Car> myCars = new ArrayList(); 

    public void initialize() { 
     myCars = loadCars(); 
     initGridpane(myCars); 
    } 

    private initGridpane(List<Car> myCars) { 

     int rowIndex = 0; 

     for (Car myCar : myCars) { 

      Button b_newCar = new Button("+"); 
      Button b_deleteCar = new Button("-"); 

      ChoiceBox<Car> cb_car = new ChoiceBox<>(); 
      cb_car.setItems(Car.getAllCarKeys()); 
      cb_car.setValue(myCar.getModel()); 


      b_deleteCar.setOnAction(new EventHandler<ActionEvent>() { 
      @Override public void handle(ActionEvent e) { 
       // remove row 
       // remove car from List myCars 
      } 
      }); 

      b_newCar.setOnAction(new EventHandler<ActionEvent>() { 
      @Override public void handle(ActionEvent e) { 
       // add new row 
      } 
      }); 

      cb_car.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { 

       @Override 
       public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
        // update myList 
       } 
      }); 

      gp_form.add(cb_car, 0, rowIndex); 
      gp_form.add(b_deleteCar, 1, rowIndex); 
      gp_form.add(b_newCar, 2, rowIndex); 

      rowIndex++; 
     } 
    } 
} 

結果は次のようになります。

result gridpane

リストからchoiceboxの行と値を削除するにはどうすればよいですか? choiceboxが変更された場合、リストを更新するにはどうすればよいですか?

+0

3番目の行で削除ボタンをクリックするとどうなりますか?現在「Car 1」を含むすべての行を削除する必要がありますか? –

+0

行3の削除ボタンをクリックした場合は、行3のみを削除する必要があります。さらに、オブジェクトカー1は私のリストで削除する必要があります(1行目のCar 1と​​3のIDは異なる)。 – tonyh

答えて

1

あなたの車リストにはたとえば1kの値が含まれている可能性があるので、ListViewをGridPaneの代わりにカスタムListCellで使用することをお勧めします。その場合、GridPaneに3k個のノードを作成すると、パフォーマンスが低下します。 ListViewは可視セルのみを作成し、必要に応じて再利用します。私は2番目のドロップダウン、保存ボタンを追加し、空の初期リストで開始を変更した

private ObservableList<Car> cars = FXCollections.observableArrayList(); 

@Override 
public void start(Stage primaryStage) { 
    cars.addAll(new Car(CAR_TYPE.CAR1), new Car(CAR_TYPE.CAR2), new Car(CAR_TYPE.CAR3)); 

    ListView<Car> carsListView = new ListView<>(); 
    carsListView.setCellFactory(c -> new CarListCell()); 
    carsListView.setItems(cars); 

    StackPane root = new StackPane(); 
    root.getChildren().add(carsListView); 

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

    primaryStage.setTitle("Cars list view"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private class CarListCell extends ListCell<Car> { 

    private HBox content = new HBox(); 
    private ChoiceBox<CAR_TYPE> cb = new ChoiceBox<>(); 
    private Button add = new Button("+"); 
    private Button sub = new Button("-"); 

    public CarListCell() { 
     cb.setItems(FXCollections.observableArrayList(CAR_TYPE.values())); 
     cb.setMaxWidth(Double.MAX_VALUE); 
     HBox.setHgrow(cb, Priority.ALWAYS); 
     content.getChildren().addAll(cb, add, sub); 
     content.setSpacing(10); 
     setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
     setGraphic(content); 
    } 

    @Override 
    protected void updateItem(Car item, boolean empty) { 
     super.updateItem(item, empty); 
     if (item == null || empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      setGraphic(content); 
      cb.setValue(item.getType()); 
      add.setOnAction(e -> { 
       Car newCar = new Car(cb.getValue()); 
       cars.add(newCar); 
      }); 
      sub.setOnAction(e -> { 
       cars.remove(item); 
      }); 
     } 
    } 

} 

private enum CAR_TYPE { 
    CAR1, CAR2, CAR3; 
} 

private class Car { 

    private CAR_TYPE type; 

    public Car(CAR_TYPE type) { 
     this.type = type; 
    } 

    public CAR_TYPE getType() { 
     return type; 
    } 

    public void setType(CAR_TYPE type) { 
     this.type = type; 
    } 
} 
+0

ありがとう、thats素晴らしいと、車の色のような同じ行に2番目のドロップダウンがある場合、どのように見えるのですか? – tonyh

0

は、このコードを試してみてください。これは正常に動作しますが、保存ボタンをクリックすると、選択したすべてのCarsをArrayListに色分けする方法はありますか?

「+」ボタンをクリックせずに最初の車を選択した場合、ObservableListは空です。

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ChoiceBox; 
import javafx.scene.control.ContentDisplay; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

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

    private ObservableList<Car> cars = FXCollections.observableArrayList(); 

    @Override 
    public void start(Stage primaryStage) { 

     Car initialCar = new Car(null,null); 

     cars.add(initialCar); 

     ListView<Car> carsListView = new ListView<>(); 
     carsListView.setCellFactory(c -> new CarListCell()); 
     carsListView.setItems(cars); 

     StackPane root = new StackPane(); 
     root.getChildren().addAll(carsListView, new Button("Save")); 

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

     primaryStage.setTitle("Cars list view"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private class CarListCell extends ListCell<Car> { 

     private HBox content = new HBox(); 
     private ChoiceBox<CAR_TYPE> cb_car = new ChoiceBox<>(); 
     private ChoiceBox<CAR_COLOR> cb_color = new ChoiceBox<>(); 
     private Button add = new Button("+"); 
     private Button sub = new Button("-"); 

     public CarListCell() { 

      cb_car.setItems(FXCollections.observableArrayList(CAR_TYPE.values())); 
      cb_color.setItems(FXCollections.observableArrayList(CAR_COLOR.values())); 

      HBox.setHgrow(cb_car, Priority.ALWAYS); 
      HBox.setHgrow(cb_color, Priority.ALWAYS); 

      content.getChildren().addAll(cb_car, cb_color, add, sub); 
      content.setSpacing(10); 
      setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
      setGraphic(content); 
     } 

     @Override 
     protected void updateItem(Car item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item == null || empty) { 
       setText(null); 
       setGraphic(null); 
      } else { 
       setGraphic(content); 
       cb_car.setValue(item.getType()); 
       cb_color.setValue(item.getColor()); 
       add.setOnAction(e -> { 
        Car newCar = new Car(cb_car.getValue(), cb_color.getValue()); 
        cars.add(newCar); 
       }); 
       sub.setOnAction(e -> { 
        cars.remove(item); 
       }); 
      } 
     } 

    } 

    private enum CAR_TYPE { 
     CAR1, CAR2, CAR3; 
    } 

    private enum CAR_COLOR { 
     BLUE, RED, GREEN; 
    } 

    private class Car { 

     private CAR_TYPE type; 
     private CAR_COLOR color; 

     public Car(CAR_TYPE type, CAR_COLOR color) { 
      this.type = type; 
      this.color = color; 
     } 

     public CAR_TYPE getType() { 
      return type; 
     } 

     public void setType(CAR_TYPE type) { 
      this.type = type; 
     } 

     public CAR_COLOR getColor() { 
      return color; 
     } 

     public void setColor(CAR_COLOR color) { 
      this.color = color; 
     } 
    } 
} 
+0

「選択されたすべての車を手に入れる」とはどういう意味ですか? ListViewに複数の選択が必要な場合や、すべての車を取得する場合すべての車はObservableList 車にあります。 – MBec

+0

完璧、ありがとう – tonyh

関連する問題