2017-05-17 2 views
0

Situation: Ich schreibe ein einfaches Notizenprogramm von Grund auf für ein Schulprojekt mit Java und JavaFX. Ich verwende Tags, um Notizen zu gruppieren. Ich kann Tags zu einer Notiz hinzufügen und wenn es ein neues Tag ist, das erstellt wird, wird es auch zu meiner Tag-Cloud hinzugefügt.Taste muss je nach Platzierung etwas andere Aktion ausführen

Jedes Tag hat eine Schaltfläche mit einem X markiert. Ich muss jetzt die Schaltfläche funktionieren, aber abhängig von der Platzierung des Tags muss ich es eines von zwei Dingen tun: 1) wenn der Benutzer entfernen möchte Tag aus einer Notiz Ich muss das Tag aus der Tagbar (einem TilePane) entfernen, wo die Tags dieser bestimmten Notiz angezeigt werden, und sie aus der Notiz entfernen. 2) Wenn der Benutzer das Tag vollständig löschen möchte, klickt der Benutzer auf X des Tags in der Tag-Cloud (das ist ein FlowPane) und das Tag wird dann aus der Tag-Cloud und aus allen Notizen entfernt.

Problem: Soweit ich es verstehe, muss ich zwei verschiedene Aktionen für den gleichen Knopf machen und ich habe keine Ahnung, wie man das macht.

Ideen: Ich habe gedacht, macht zwei verschiedene Arten von Tags mit jeweils eigener FXML-Datei, aber ich bin nicht sicher.

Frage: Wie mache ich zwei verschiedene Aktionen für die gleiche Schaltfläche und wie mache ich es so, dass die richtige Aktion aufgerufen wird?

Hier ist ein Link zu dem, was das Programm sieht wie bisher: enter image description here

+1

Ich sehe 2 verschiedene 'x' Tasten. Eine auf der Oberseite ("Wolke") und eine auf der linken Seite. Weisen Sie jeder eine eigene Aktion zu. – user1803551

+0

Um zu wissen, wo sich die Schaltfläche befindet, müssen Sie nur sicherstellen, dass das übergeordnete Element, das die Schaltflächen enthält, eine fx: id hat. Wenn Sie dann auf den Button klicken, sehen Sie, wer der Elternteil ist. Schalten Sie die Aktion für das übergeordnete Element um. – Sedrick

+1

Dies sind jedoch nicht die gleichen Tasten. Z.B. Der "private" -Tag-Button in der Tag-Leiste ist (unbedingt) ein anderer Button als der "private" -Tag-Button in der Tag-Cloud. Jeder hat also einen Event-Handler, der eine andere Aktion ausführt. Wo ist das Problem? –

Antwort

0

Hier ist eine App, die Sie spielen können. Ich ging here für den Start. Diese App erstellt zwei Gruppen von Tags und löscht alle Tags mit derselben ID, wenn eine gelöscht wird.

Main:

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class JavaFXApplication102 extends Application 
{ 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

     Scene scene = new Scene(root); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     launch(args); 
    }   
} 

Controller:

import java.io.File; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import java.util.ResourceBundle; 
import javafx.application.Platform; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.event.EventType; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 

/** 
* 
* @author blj0011 
*/ 
public class FXMLDocumentController implements Initializable 
{ 

    @FXML 
    private VBox vbMain; 

    @FXML 
    private FlowPane fpMain; 

    String[] tagType = {"Chicken", "Soup", "Fall", "Winter", "Happy"}; 
    Random random = new Random(); 




    @FXML 
    private void handleButtonAction(ActionEvent event) 
    { 
     int control = random.nextInt(5); 

     HBox tag1 = new HBox(); 
     tag1.setId(tagType[control]); 
     tag1.setStyle("-fx-padding:4;" + 
      "  -fx-border-width: 2;" + 
      "  -fx-border-color: black;" + 
      "  -fx-border-radius: 4;" + 
      "  -fx-background-color: f1f1f1;" + 
      "  -fx-border-insets: 5;"); 
     tag1.setSpacing(5); 
     tag1.setPrefHeight(20); 
     tag1.setMaxWidth(75); 

     tag1.getChildren().add(new Label(tagType[control])); 

     Label closingX1 = new Label("x"); 
     tag1.getChildren().add(closingX1);   
     closingX1.setOnMouseClicked((MouseEvent event1) -> { 
      System.out.println("Parent: " + ((Label) event1.getSource()).getParent().getParent());  
      for(Node child : fpMain.getChildren()) 
      { 
       if(child.getId().equals(tag1.getId())) 
       { 
        Platform.runLater(()->fpMain.getChildren().remove(child)); 
       } 
      } 

      for(Node child : vbMain.getChildren()) 
      { 
       if(child.getId().equals(tag1.getId())) 
       { 
        Platform.runLater(()->vbMain.getChildren().remove(child)); 
       } 
      }    
     }); 


     vbMain.getChildren().add(tag1); 



     HBox tag2 = new HBox(); 
     tag2.setId(tagType[control]); 
     tag2.setStyle("-fx-padding:4;" + 
      "  -fx-border-width: 2;" + 
      "  -fx-border-color: black;" + 
      "  -fx-border-radius: 4;" + 
      "  -fx-background-color: f1f1f1;" + 
      "  -fx-border-insets: 5;"); 
     tag2.setSpacing(5); 
     tag2.setPrefHeight(20); 
     tag2.setMaxWidth(75);   
     tag2.getChildren().add(new Label(tagType[control])); 

     Label closingX2 = new Label("x"); 
     tag2.getChildren().add(closingX2);   
     closingX2.setOnMouseClicked((MouseEvent event1) -> { 
      System.out.println("Parent: " + ((Label) event1.getSource()).getParent().getParent()); 
      for(Node child : vbMain.getChildren()) 
      { 
       if(child.getId().equals(tag2.getId())) 
       { 
        Platform.runLater(()->vbMain.getChildren().remove(child)); 
       } 
      } 

      for(Node child : fpMain.getChildren()) 
      { 
       if(child.getId().equals(tag2.getId())) 
       { 
        Platform.runLater(()->fpMain.getChildren().remove(child)); 
       } 
      } 
     }); 

     fpMain.getChildren().add(tag2);   
    } 



    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    {  

    }  

} 

FXML:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.FlowPane?> 
<?import javafx.scene.layout.VBox?> 

<AnchorPane id="AnchorPane" prefHeight="623.0" prefWidth="820.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication102.FXMLDocumentController"> 
    <children> 
     <Button fx:id="button" layoutX="372.0" layoutY="569.0" onAction="#handleButtonAction" text="add button" /> 
     <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" /> 
     <VBox fx:id="vbMain" prefHeight="549.0" prefWidth="387.0" /> 
     <FlowPane fx:id="fpMain" layoutX="371.0" layoutY="18.0" prefHeight="505.0" prefWidth="434.0" /> 
    </children> 
</AnchorPane> 

In den folgenden Bildern fügte ich zufällig drei Tags hinzu und löschte dann das Huhn-Tag.

enter image description hereenter image description here

Verwandte Themen