2016-11-03 4 views
0

Я использую JavaFX и хотел бы, чтобы при нажатии кнопки в поле расстановки создавалась и отображалась новая радиокнопка. Это возможно? Я пытался это сделать, но ничего не появляется.Создайте новые параметры переключателя во время выполнения

Редактировать: Проблема возникает из метода insertDemand() в классе Controller. Появятся переключатели, если я удалю первые две строки метода. Я понятия не имею, почему он это делает. Но мне нужно, когда на кнопку будет нажата строка, которая появится на экране, а также появится радиокнопка, поэтому удаление этих двух строк не является возможным решением.

Вот 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> 

Вот класс контроллера:

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); 
    } 
} 

Спрос класс я сделал. При создании отображается строка:

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; 
     } 
    } 

} 

Спасибо за вашу помощь :)

Edit 2: Я нашел, как заставить его работать. Не знаю, почему это исправляет проблему, но если вы перенесите первые две строки метода insertDemand() в нижнюю часть, чтобы сначала создать радиокнопку, а затем создать объект Deman, то он будет работать.

+0

Я не эксперт здесь, но, я думаю, вам нужно использовать Java API для добавления новых переключателей во время выполнения. – Thomas

+1

Работает для меня. Пожалуйста, опубликуйте [mcve]. – fabian

+0

Полный класс fxml + controller (+ код, используемый для загрузки fxml, может быть?) Покажет нам проблему ... Единственные шаги, которые я сделал для выполнения этой работы, - это обернуть 'Button' и' FlowPane' в 'VBox 'и добавьте фрагмент кода в контроллер. Кстати: ваше окно/родитель 'FlowPane' не слишком мал, чтобы случайно показать дополнительных дочерних элементов« FlowPane »? – fabian

ответ

0

Я сделал простой пример, который работает. Я не беспокоился об FXML, но я не понимаю, почему это было бы иначе. Если у вас все еще есть проблемы, вам нужно предоставить пример, который не работает.

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

Спасибо Дэвиду за то, что нашли время, чтобы написать это. Я обновил сообщение, чтобы попытаться найти то, что не работает. Цените все! –