2017-05-15 2 views
1

J'ai créé un tableau de HBox, boutons et étiquettes. Chaque fois qu'un bouton « Ajouter » est pressé, je mets:Comment supprimer un noeud d'un volet de flux dans JavaFX?

hbox[count] = new HBox(); 
buttons[count] = new Button(); 
labels[count] = new Label(); 

(où le nombre commence à 0 et se termine à 5) Je puis ajouter le bouton et l'étiquette à l'HBox (de sorte que chaque HBox contient un bouton et une étiquette) et enfin ajouter les 5 HBoxes à un volet de flux. Comment puis-je supprimer un HBox du volet de flux en cliquant sur le bouton à l'intérieur du HBox?enter image description hereCeci est une image de chacun des HBox dans le volet de flux.

/** 
* FXML Controller class 
* 
* @author HeshamSaleh 
*/ 
public class SecondaryViewController implements Initializable { 

@FXML 
private TextField searchBar; 
@FXML 
private Button addBtn; 
@FXML 
private FlowPane flowPane; 

ArrayList<String> addedArtists = new ArrayList<String>(); 
String[] artists = {"Craig David", "Coldplay", "Eminem", "D12", "Shakira", "Radiohead", "Linkin Park", "Maroon 5", "Celine Dion", "50 Cent", "Tupac", "Snoop Dogg", "Metallica", "Backstreet Boys"}; 
List<String> artistNames = new ArrayList<String>(Arrays.asList(artists)); 
int count = 4; 
HBox[] hboxArr = new HBox[5]; 
Button[] buttonArr = new Button[5]; 
Label[] labelArr = new Label[5]; 
int hboxCount = 0; 
/** 
* Initializes the controller class. 
*/ 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    searchBar.setFocusTraversable (false); 
    TextFields.bindAutoCompletion(searchBar, artistNames); 
} 

@FXML 
private void addBtnPressed(MouseEvent event) { 
    String artistName = searchBar.getText(); 
    searchBar.setText(""); 

    if(artistNames.contains(artistName) && !addedArtists.contains(artistName) && count != -1) { 

     hboxArr[hboxCount] = new HBox(); 
     buttonArr[hboxCount] = new Button(); 
     labelArr[hboxCount] = new Label(); 
     hboxArr[hboxCount].setAlignment(Pos.CENTER); 
     hboxArr[hboxCount].setSpacing(-1); 
     buttonArr[hboxCount].setText("X"); 
     buttonArr[hboxCount].setAlignment(Pos.CENTER); 
     buttonArr[hboxCount].setStyle("-fx-background-color: TRANSPARENT; -fx-border-color: #000000;"); 
     buttonArr[hboxCount].setFont(Font.font("Open Sans", FontWeight.BOLD, 12)); 
     buttonArr[hboxCount].setMinWidth(20); 
     buttonArr[hboxCount].setMinHeight(20); 
     labelArr[hboxCount].setText(artistName.toUpperCase()); 
     labelArr[hboxCount].setFont(Font.font("Proxima Nova Rg", 12)); 
     labelArr[hboxCount].setAlignment(Pos.CENTER); 
     labelArr[hboxCount].setStyle("-fx-background-color: TRANSPARENT; -fx-border-color: #000000;"); 
     labelArr[hboxCount].setMinWidth(90); 
     labelArr[hboxCount].setMinHeight(27); 

     hboxArr[hboxCount].getChildren().addAll(buttonArr[hboxCount], labelArr[hboxCount]); 
     flowPane.setAlignment(Pos.CENTER); 
     flowPane.getChildren().add(hboxArr[hboxCount]); 
     addedArtists.add(artistName); 
     count--; 
     hboxCount++; 
    } 

} 
} 

Répondre

2

Voici un exemple ... vous pouvez prendre l'idée de la mise en œuvre et l'appliquer à votre programme:

import java.util.ArrayList; 
import javafx.application.Application; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class Example extends Application{ 

    ArrayList<Node> components = new ArrayList<Node>(); // arraylist to contain all components 


    @Override 
    public void start(Stage ps) throws Exception { 
     FlowPane root = new FlowPane(); 

     for (int i=0; i<5; i++){ 

      HBox hb = new HBox(); 
      // set hb attributes 

      Button b = new Button("Button" + i); 
      // set b attributes 

      // then add action listener 
      b.setOnAction(e->{ 
       root.getChildren().remove(hb); // remove by Object reference 
      }); 

      Label l = new Label("Label" + i); 
      // set l attributes 

      hb.getChildren().addAll(b,l); 
      components.add(hb); 
     } 

     root.getChildren().addAll(components); 

     Scene s = new Scene(root, 600,400); 
     ps.setScene(s); 

     ps.show(); 

    } 

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

} 

MISE À JOUR:

Après avoir fourni le code , tout ce que vous devez faire est d'ajouter ceci à votre code:

buttonArr[hboxCount].setOnAction(e->{ // add listener to your button at every index in your array of buttons 
    flowPane.getChildren().remove(hboxArr[hboxCount]); // and when that button is pressed, remove the HBox at the same index in the array of HBoxs from the flowPane (that works as I said -> removing by Object Reference) 
}); 
+0

Comment sauriez-vous quel hb vous supprimez? J'ai besoin de supprimer un hb spécifique lorsque son bouton est pressé –

+1

@HeshamSaleh Akhi il supprime le HBox (ie parent) du bouton pressé .. s'il vous plaît copier-coller le code dans votre IDE et vérifier :) – Yahya

+0

Ok, votre code fait exactement Ce dont j'ai besoin. Pouvez-vous s'il vous plaît m'aider à l'implémenter dans mon code ci-dessus? Merci beaucoup Yahya! –