Tenho tentado desmarcar ou limpar o valor da caixa de escolha, a partir de quando um usuário seleciona outra opção na mesma caixa. Quando seleciono uma marca de carro e depois seleciono outra todas as opções são exibidas, se eu selecionar a mesma as imagens apenas duplicam e a primeira das imagens fica em branco e apenas os botões permanecem... Eu tentei/setValue null/isVisible /setVisible/ mas o espaço dos botões ainda está lá.... até tentei fazer getchildren remove... estou perdido..
public class HelloController implements Initializable {
private Stage stage;
private Scene scene;
private Parent root;
@FXML private Label lbMake;
@FXML private Label lbBody;
@FXML private Label lbColor;
@FXML private Label lbEngine;
@FXML private Label lbPerformance;
@FXML private Label lbPrice;
@FXML private TilePane tilePaneMain;
@FXML private ChoiceBox<String> cbMake;
@FXML private ChoiceBox<String> cbColor;
@FXML private ChoiceBox<String> cbPerformance;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
displayGallery();
cbMake.getItems().addAll("Clear Choice","Aston Martin","BMW","Ferrari","Genesis","Hummer","Lamborghini","Lincoln","Lucid","Maserati","Maybach","McLaren","Rolls-Royce","Tesla");
cbMake.setOnAction(this::getMake);
cbColor.getItems().addAll("Clear Choice","black","blue","green","orange","red","white","yellow","gold");
cbColor.setOnAction(this::getColor);
cbPerformance.getItems().addAll("Clear Choice","2.3","2.5","2.7","3.0","3.6","3.8","4.2");
cbPerformance.setOnAction(this::getPerformance);
}
// This is the constructors for the data.
Cars car0 = new Cars("Aston Martin", "220000.00", "black", "8", "3.6", new ImageView(new Image(getClass().getResourceAsStream("/car0.jpg"))),"yes");
Cars car1 = new Cars("Aston Martin", "220000", "blue", "8", "3.6", new ImageView(new Image(getClass().getResourceAsStream("/car1.jpg"))),"no");
Cars car2 = new Cars("Aston Martin", "220000", "green", "8", "3.6", new ImageView(new Image(getClass().getResourceAsStream("/car2.jpg"))),"no");
Cars car3 = new Cars("Aston Martin", "220000", "red", "8", "3.6", new ImageView(new Image(getClass().getResourceAsStream("/car3.jpg"))),"yes");
Cars car4 = new Cars("Cadillac", "110000", "blue", "0", "4.8", new ImageView(new Image(getClass().getResourceAsStream("/car4.jpg"))),"no");
Cars car5 = new Cars("Cadillac", "110000", "red", "0", "4.8", new ImageView(new Image(getClass().getResourceAsStream("/car5.jpg"))),"no");
Cars car6 = new Cars("Maserati", "200000", "black", "8", "3.8", new ImageView(new Image(getClass().getResourceAsStream("/car6.jpg"))),"no");
Cars car7 = new Cars("Maserati", "200000", "blue", "8", "3.8", new ImageView(new Image(getClass().getResourceAsStream("/car7.jpg"))),"no");
Cars car8 = new Cars("Maserati", "200000", "red", "8", "3.8", new ImageView(new Image(getClass().getResourceAsStream("/car8.jpg"))),"no");
Cars car9 = new Cars("Maserati", "200000", "white", "8", "3.8", new ImageView(new Image(getClass().getResourceAsStream("/car9.jpg"))),"yes");
Cars car10 = new Cars("Lamborghini", "400000", "black", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car10.jpg"))),"no");
Cars car11 = new Cars("Lamborghini", "400000", "black", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car11.jpg"))),"yes");
Cars car12 = new Cars("Lamborghini", "400000", "blue", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car12.jpg"))),"yes");
Cars car13 = new Cars("Lamborghini", "400000", "green", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car13.jpg"))),"no");
Cars car14 = new Cars("Lamborghini", "400000", "white", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car14.jpg"))),"no");
Cars car15 = new Cars("Lamborghini", "400000", "yellow", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car15.jpg"))),"no");
Cars car16 = new Cars("McLaren", "365000", "yellow", "8", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car16.jpg"))),"no");
Cars car17 = new Cars("McLaren", "365000", "blue", "8", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car17.jpg"))),"no");
Cars car18 = new Cars("McLaren", "365000", "green", "8", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car18.jpg"))),"no");
Cars car19 = new Cars("McLaren", "365000", "black", "8", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car19.jpg"))),"no");
Cars car20 = new Cars("McLaren", "365000", "red", "8", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car20.jpg"))),"no");
Cars car21 = new Cars("McLaren", "400000", "orange", "10", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car21.jpg"))),"yes");
Cars car22 = new Cars("Ferrari", "400000", "black", "12", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car22.jpg"))),"yes");
Cars car23 = new Cars("Ferrari", "400000", "blue", "12", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car23.jpg"))),"yes");
Cars car24 = new Cars("Ferrari", "400000", "red", "8", "2.7", new ImageView(new Image(getClass().getResourceAsStream("/car24.jpg"))),"no");
Cars car25 = new Cars("Ferrari", "400000", "white", "12", "2.5", new ImageView(new Image(getClass().getResourceAsStream("/car25.jpg"))),"yes");
Cars car26 = new Cars("Ferrari", "400000", "white", "8", "2.7", new ImageView(new Image(getClass().getResourceAsStream("/car26.jpg"))),"no");
Cars car27 = new Cars("Ferrari", "400000", "yellow", "8", "2.7", new ImageView(new Image(getClass().getResourceAsStream("/car27.jpg"))),"no");
Cars car28 = new Cars("Lincoln", "365000", "black", "12", "4.2", new ImageView(new Image(getClass().getResourceAsStream("/car28.jpg"))),"no");
Cars car29 = new Cars("Lincoln", "365000", "gray", "12", "4.2", new ImageView(new Image(getClass().getResourceAsStream("/car29.jpg"))),"no");
Cars car30 = new Cars("Hummer", "180000", "blue", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car30.jpg"))),"no");
Cars car31 = new Cars("Hummer", "180000", "orange", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car31.jpg"))),"no");
Cars car32 = new Cars("Hummer", "180000", "white", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car32.jpg"))),"no");
Cars car33 = new Cars("Hummer", "180000", "gray", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car33.jpg"))),"no");
Cars car34 = new Cars("Hummer", "180000", "white", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car34.jpg"))),"no");
Cars car35 = new Cars("Lucid", "150000", "blue", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car35.jpg"))),"no");
Cars car36 = new Cars("Lucid", "150000", "red", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car36.jpg"))),"no");
Cars car37 = new Cars("Lucid", "150000", "white", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car37.jpg"))),"no");
Cars car38 = new Cars("Rivian", "100000", "red", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car38.jpg"))),"no");
Cars car39 = new Cars("Rivian", "100000", "blue", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car39.jpg"))),"no");
Cars car40 = new Cars("Maybach", "400000", "red", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car40.jpg"))),"no");
Cars car41 = new Cars("BMW", "250000", "gold", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car41.jpg"))),"no");
Cars car42 = new Cars("Rolls-Royce", "500000", "gold", "0", "3.0", new ImageView(new Image(getClass().getResourceAsStream("/car42.jpg"))),"no");
Cars car43 = new Cars("Genesis", "300000", "white", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car43.jpg"))),"yes");
Cars car44 = new Cars("Tesla", "50000", "gray", "0", "2.3", new ImageView(new Image(getClass().getResourceAsStream("/car44.jpg"))),"no");
// This is adding the constructor to an Array
public ArrayList<Cars> getList() {
ArrayList<Cars> carList = new ArrayList<>();
return carList;
}
// This display the gallery to the opening scene.
public void displayGallery() {
int i =0;
for (i = 0; i < getList().size(); i++) {
ImageView imageView = new ImageView(new Image(getClass().getResourceAsStream("/car" + i + ".jpg")));
imageView.setFitWidth(200);
imageView.setFitHeight(155);
Button btnGallery = new Button(Integer.toString(i),imageView);
int finalI = i;
btnGallery.setOnMouseEntered(event->{
//btnGallery.setTextFill(Color.PURPLE);
lbMake.setText(getList().get(finalI).getMake());
lbColor.setText(getList().get(finalI).getColor());
lbPerformance.setText(getList().get(finalI).getPerformance());
lbPrice.setText(getList().get(finalI).getPrice());
lbEngine.setText(getList().get(finalI).getCylinder());
lbBody.setText(getList().get(finalI).getIsConvertable());
});
btnGallery.setOnMouseExited(event->{
//btnGallery.setTextFill(Color.BLACK);
lbMake.setText("");
lbColor.setText("");
lbPerformance.setText("");
lbPrice.setText("");
lbEngine.setText("");
lbBody.setText("");
});
btnGallery.setOnAction(ae-> {
try {
String btnText = btnGallery.getText();
ArrayList<Cars> passList = getList();
FXMLLoader loader = new FXMLLoader(getClass().getResource("payment-view.fxml"));
root = loader.load();
PaymentController paymentController = loader.getController();
paymentController.displayName(btnText);
paymentController.getArrayList(passList);
stage = (Stage) ((Node) ae.getSource()).getScene().getWindow();
scene = new Scene(root);
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
});
//tilePaneMain.getChildren().add(btnGallery);
}
}
// Display results but doesn't remove previous selection once another is made, if another enter //image description herechoice box selction is made,if images duplicate then empty buttons //remain.
private void getMake(ActionEvent actionEvent) {
for (int index = 0; index < getList().size();index++){
if ((getList().get(index).getMake().contains(cbMake.getValue()))){
getList().get(index).getImage().setFitWidth(175);
getList().get(index).getImage().setFitHeight(150);
Button btnMake = new Button();
btnMake.setGraphic(getList().get(index).getImage());
tilePaneMain.getChildren().add(btnMake);
}
}
}
private void getColor(ActionEvent actionEvent) {
for (int index = 0; index < getList().size();index++){
if ((getList().get(index).getColor().contains(cbColor.getValue()))){
getList().get(index).getImage().setFitWidth(175);
getList().get(index).getImage().setFitHeight(150);
Button btnMake = new Button();
btnMake.setGraphic(getList().get(index).getImage());
tilePaneMain.getChildren().add(btnMake);
}
}
}
private void getPerformance(ActionEvent actionEvent) {
for (int index = 0; index < getList().size();index++){
if ((getList().get(index).getPerformance().contains(cbPerformance.getValue()))){
getList().get(index).getImage().setFitWidth(175);
getList().get(index).getImage().setFitHeight(150);
Button btnMake = new Button();
btnMake.setGraphic(getList().get(index).getImage());
tilePaneMain.getChildren().add(btnMake);
}
}
}
}
O que você está tentando fazer é implementar um conjunto de filtros que podem ser aplicados à lista de itens a serem exibidos.
Problemas com sua abordagem atual
Os principais problemas em seu código atual (provavelmente existem outros) são estes:
tilePaneMain.getChildren().clear()
. Caso contrário, o que você está fazendo é manter a exibição da galeria para a seleção anterior.initialize
método você chamadisplayGallery
para fazer todo esse trabalho de criar botões com ações customizadas, então você nunca os utiliza pois esta linha está comentada://tilePaneMain.getChildren().add(btnGallery);
.Solução proposta: use um ControlsFX GridView apoiado por uma lista filtrada
Eu consideraria um ControlsFX GridView para isso. Isso é apoiado por um
ObservableList
que pode ser umFilteredList
onde o filtro é aplicado dinamicamente com base nas alterações nas sugestões de pesquisa, de forma semelhante à forma como a filtragem funciona em um ListView .É melhor usar uma lista filtrada e atualizar os filtros da lista para aplicá-los, mesmo que você não use o ControlsFX
GridView
.Solução de exemplo: lista filtrada sem controle virtualizado
Neste exemplo, demonstrarei a criação e aplicação de filtros para mostrar itens em uma galeria filtrada. Não usarei um ControlsFX
GridView
(embora seja preferível), pois não quero adicionar aqui uma dependência de software de terceiros. AListView
poderia ser usado no lugar de aGridView
, mas isso pode estar menos próximo do comportamento que você deseja, então não demonstrarei isso aqui.Em vez disso, o que farei é pegar
TilePane
e filtrar o conteúdo mostrado lá. A filtragem e a implementação fornecidas são menos eficientes do que usar um controle virtualizado com células como aListView
ouGridView
, mas é adequado para um pequeno exemplo como este. ATilePane
solução baseada também está mais próxima da sua implementação original do que a solução de estilo de controle virtualizado.Também não usarei arquivos FXML ou CSS externos para manter as coisas mais independentes.
Você precisa modelar uma concessionária de automóveis e fornecer uma IU para ela.
Para isso você precisa de um tipo de carro:
Uma forma de representar as cores dos carros:
Uma concessionária com carros e algumas informações sobre eles:
Uma maneira de exibir um carro individual:
Showroom dos carros disponíveis na concessionária:
Alguns controles para filtrar os carros mostrados:
E um aplicativo para unir tudo:
Então você obtém algo assim:
Todos os carros:
Todos os Aston Martins:
Todos Aston Martins verdes: