2015-10-06 1 views
1

У меня есть количество объектов. Предположим, у меня есть объект 10 Books, и я хочу, чтобы пользователь выбирал любой номер книги. Когда пользователь нажимает кнопку отправки, я хочу получить все выбранные пользователем «объекты».Как сохранить весь объект для флажка в javafx

В настоящее время, в то время как показывает экран для пользователя я использовать

CheckBox cb= new CheckBox(book.getName()); 

это показывает BookName к пользователю, и пользователь выбирает книгу. Но во время выполнения мне также понадобятся bookid и другие свойства объекта книги.

Есть ли какой-либо способ, через который я могу сохранить объект книги в флажке?

+0

Почему бы не использовать '' ListView и просто использовать встроенный в модели выбора, вместо того, чтобы использовать флажки? –

ответ

3

Базовый экзамен. если вы хотите больше sepecifc, вам нужно разместить свой код, мы можем установить объект на узел с помощью setUserDate, тогда мы сможем использовать этот объект, когда нам нужно. здесь я использую идентификатор объекта, например, в йор случае сохранить этот объект я надеюсь, что это решит вашу проблему,? s оставить комментарий

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class UserData extends Application { 

public void start(Stage primaryStage) { 
    VBox root = new VBox(); 
    Book book = new Book(22, "firstBok"); 
    Book book1 = new Book(2, "secondBok"); 
    CheckBox checkB = new CheckBox(book.getName()); 
    checkB.setUserData(book); 
    CheckBox checkB1 = new CheckBox(book1.getName()); 
    checkB1.setUserData(book1); 
    Button btn = new Button("Submit"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      if (checkB.isSelected()) { 
       int firstCheckBxId = ((Book) checkB.getUserData()).getId(); 
       System.out.println("id:" + firstCheckBxId); 
      } 
      if (checkB1.isSelected()) { 
       int secondCheckBxId = ((Book) checkB1.getUserData()).getId(); 
       System.out.println("id:" + secondCheckBxId); 
      } 

     } 
    }); 
    root.getChildren().addAll(checkB, checkB1, btn); 
    primaryStage.setScene(new Scene(root)); 
    primaryStage.show(); 
} 

class Book { 
    int id; 
    private String name; 

    Book(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public int getId() { 
     return this.id; 
    } 

    public String getName() { 
     return name; 
    } 

} 

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

} 
0

Рассмотрим с помощью элемента управления с встроенными функциями выбора, такие как ListView , Затем вы можете просто проверить модель выбора.

import java.util.stream.IntStream; 

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class BookSelection extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     ListView<Book> bookList = new ListView<>(); 
     bookList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

     bookList.setCellFactory(lv -> new ListCell<Book>() { 
      @Override 
      public void updateItem(Book book, boolean empty) { 
       super.updateItem(book, empty); 
       if (empty) { 
        setText(null); 
       } else { 
        setText(book.getTitle()); 
       } 
      } 
     }); 

     IntStream.rangeClosed(1, 10).mapToObj(i -> new Book("Book "+i)).forEach(bookList.getItems()::add); 

     Button submit = new Button("Submit selection"); 
     submit.setOnAction(e -> 
       bookList.getSelectionModel().getSelectedItems().forEach(book -> System.out.println(book.getTitle()))); 

     BorderPane root = new BorderPane(bookList, null, null, submit, null); 
     BorderPane.setAlignment(submit, Pos.CENTER); 
     BorderPane.setMargin(submit, new Insets(10)); 

     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static class Book { 
     private final StringProperty title = new SimpleStringProperty() ; 
     public Book(String title) { 
      setTitle(title); 
     } 
     public final StringProperty titleProperty() { 
      return this.title; 
     } 
     public final java.lang.String getTitle() { 
      return this.titleProperty().get(); 
     } 
     public final void setTitle(final java.lang.String title) { 
      this.titleProperty().set(title); 
     } 


    } 

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

Если по какой-то причине вы действительно хотите реализовать это с помощью флажков, вы можете сохранить Set<Book> представляющие выбранные книги, и обновлять его при выборе каждого флажка/невыбранным. Обратите внимание, что это похоже на ответ @ user99370, но более надежный, так как он избегает downcasting (по существу неизвестного типа) userData для вашего типа данных.

import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import java.util.stream.Collectors; 
import java.util.stream.IntStream; 

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.Label; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class BookSelection extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane grid = new GridPane(); 
     grid.setHgap(5); 
     grid.setVgap(5); 
     grid.setPadding(new Insets(10)); 
     List<Book> books = IntStream.rangeClosed(1, 10).mapToObj(i -> new Book("Book "+i)).collect(Collectors.toList()); 

     Set<Book> selectedBooks = new HashSet<>(); 

     int row = 0 ; 
     for (Book book : books) { 
      CheckBox checkBox = new CheckBox(); 
      checkBox.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
       if (isNowSelected) { 
        selectedBooks.add(book); 
       } else { 
        selectedBooks.remove(book); 
       } 
      }); 
      grid.addRow(row, checkBox, new Label(book.getTitle())); 
      row++ ; 
     } 

     Button submit = new Button("Submit selection"); 
     submit.setOnAction(e -> 
       selectedBooks.forEach(book -> System.out.println(book.getTitle()))); 

     GridPane.setHalignment(submit, HPos.CENTER); 
     grid.add(submit, 0, row, 2, 1); 

     Scene scene = new Scene(grid, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static class Book { 
     private final StringProperty title = new SimpleStringProperty() ; 
     public Book(String title) { 
      setTitle(title); 
     } 
     public final StringProperty titleProperty() { 
      return this.title; 
     } 
     public final java.lang.String getTitle() { 
      return this.titleProperty().get(); 
     } 
     public final void setTitle(final java.lang.String title) { 
      this.titleProperty().set(title); 
     } 


    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
Смежные вопросы