2016-11-03 3 views
0

Ich verwende JavaFX und möchte, dass beim Klicken auf eine Schaltfläche ein neues Optionsfeld erstellt und in einem Ablauffenster angezeigt wird. Ist das möglich? Ich habe versucht, dies zu tun, aber nichts scheint zu erscheinen.Erstellen neuer Optionsfeldoptionen während der Laufzeit

Edit: Das Problem scheint von der insertDemand() -Methode in der Controller-Klasse zu stammen. Die Optionsschaltflächen erscheinen, wenn ich die ersten beiden Zeilen der Methode entferne. Ich habe keine Ahnung, warum das so ist. Aber ich brauche, wenn der Knopf angeklickt wird eine Linie auf dem Bildschirm erscheinen sowie die Radio-Taste zu erscheinen, so dass das Entfernen dieser beiden Linien ist keine praktikable Lösung. Hier

ist die fxml:

<GridPane alignment="center" hgap="10" prefHeight="800.0" prefWidth="1200.0" stylesheets="/sample/sample.css" vgap="10" xmlns="http://javafx.com/javafx/8.0.76-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
    <children> 
     <!--Insert--> 
     <ScrollPane GridPane.columnIndex="0" GridPane.rowIndex="1" GridPane.rowSpan="4"> 
      <content> 
       <FlowPane> 
        <Button fx:id="demandB" mnemonicParsing="false" onAction="#insertDemand" text="Demand" /> 
       </FlowPane> 
      </content> 
     </ScrollPane> 
     <StackPane fx:id="workspaceSP" GridPane.columnIndex="1" GridPane.rowIndex="0" GridPane.rowSpan="2"> 
     </StackPane> 
     <ScrollPane GridPane.columnIndex="1" GridPane.rowIndex="3"> 
      <content> 
       <FlowPane fx:id="lineButtonsFP" prefHeight="100.0"> 
        <Label text="Select a Curve:" /> 

       </FlowPane> 
      </content> 
     </ScrollPane> 
    </children> 
    <columnConstraints> 
     <ColumnConstraints maxWidth="600.0" minWidth="392.0" prefWidth="400.0" /> 
    </columnConstraints> 
    <rowConstraints> 
     <RowConstraints maxHeight="200.0" minHeight="22.0" prefHeight="39.0" /> 
     <RowConstraints /> 
    </rowConstraints> 
</GridPane> 

Hier ist der Controller-Klasse:

public class Controller { 

    static Parent graphMaker; 
    @FXML 
    StackPane workspaceSP; 
    @FXML 
    FlowPane lineButtonsFP; 
    static LinkedList<Demand> curvesLL; 
    ToggleGroup group = new ToggleGroup(); 
    public void insertDemand() { 
     Demand demand = new Demand(workspaceSP,200,200,400,400); 
     curvesLL.add(demand); 
     RadioButton radioButton = new RadioButton("Demand"); 
     radioButton.setToggleGroup(group); 
     radioButton.setSelected(true); 
     lineButtonsFP.getChildren().add(radioButton); 
    } 
} 

Demand ist eine Klasse ich gemacht habe. Wenn erstellt wird eine Zeile angezeigt:

public class Demand { 

     public Demand(Pane pane, double startX, double startY, double endX, double endY){ 
      pane.getChildren().add(makeLine(startX, startY, endX, endY)); 
     } 

     private Line makeLine(double startX, double startY, double endX, double endY) { 
      Line line = new Line(startX, startY, endX, endY); 
      return line; 
     } 
    } 

} 

Vielen Dank für Ihre Hilfe :)

Edit 2: Ich fand, wie es funktioniert. Keine Ahnung, warum das das Problem behebt, aber wenn Sie die ersten beiden Zeilen der insertDemand() -Methode nach unten verschieben, so dass das Optionsfeld zuerst erstellt wird und dann das Deman-Objekt erstellt wird, funktioniert es.

+0

Ich bin kein Experte hier, aber ich nehme an, Sie müssen die Java-API verwenden, um neue Optionsfelder zur Laufzeit hinzuzufügen. – Thomas

+1

Funktioniert für mich. Bitte poste ein [mcve]. – fabian

+0

Eine vollständige fxml + Controller-Klasse (+ der Code zum Laden der fxml vielleicht?) Würde uns das Problem zeigen ... Die einzigen Schritte, die ich getan habe, um diese Arbeit zu machen, ist den 'Button' und' FlowPane' in eine 'VBox zu wickeln 'und füge dein Code-Snippet dem Controller hinzu. Übrigens: Dein Elternteil ist nicht zu klein, um die zusätzlichen Kinder des FlowPane zufällig zu zeigen. – fabian

Antwort

0

Ich habe ein einfaches Beispiel, das funktioniert. Ich habe mich nicht mit FXML beschäftigt, aber ich verstehe nicht, warum das anders wäre. Wenn Sie immer noch Probleme haben, müssen Sie ein Beispiel angeben, das nicht funktioniert.

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.RadioButton; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.FlowPane; 
import javafx.stage.Stage; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 
      FlowPane lineButtonsFP = new FlowPane(); 
      root.setCenter(lineButtonsFP); 
      ToggleGroup group = new ToggleGroup(); 

      Button add = new Button("add"); 
      root.setTop(add); 
      add.setOnAction((action) -> 
      { 
       RadioButton radioButton = new RadioButton("Demand"); 
       radioButton.setToggleGroup(group); 
       radioButton.setSelected(true); 
       lineButtonsFP.getChildren().add(radioButton);     
      }); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

Danke David, dass du dir die Zeit genommen hast, das zu schreiben. Ich habe den Beitrag aktualisiert, um herauszufinden, was nicht funktioniert. Schätze alles! –

Verwandte Themen