2016-07-11 3 views
3

Поэтому при выборе или снятии выделения с MenuItem мне нужно добавить и удалить строки в GridPane.Создание динамической GridPane (добавление и удаление строк)

Поэтому при выборе MenuItem он должен добавить 1 или 2 строки в существующую GridPane. При отмене выбора следует удалить 1 или 2 строки.

Всегда существует фиксированная строка, которую нельзя удалить. добавленные или удаленные строки должны быть добавлены или удалены над этой фиксированной строкой.

Например:

Добавить ряд:

added --------- 

added --------- 

fixed --------- 

Удалить ряд:

removed 

removed 

fixed ----------- 

Я знаю, как обращаться действия для MenuItems. Мне нужна помощь только с динамической сеткой.

Существует встроенная функция addRow для GridPanes, возможно, ее единственная в использовании. Как я могу это решить? Благодаря! Все советы оценены.

+0

Было бы проще просто скрыть/показать строки, а не добавлять и удалять их? Это соответствует вашим потребностям? – DVarga

+0

Да, я полагаю, что это сработает, но это не может быть пробел между верхней и нижней строкой. В таком случае они должны быть собраны вместе. – user2909180

+0

Существует пример Java-качания, как он работает, за исключением добавления строки вместо нее: http://www.lionblogger.com/adding-and-removing-components-dynamically-from-jpanel/. Это хороший способ использовать этот пример и интегрироваться в мой проект? Как использовать компоненты Swing при использовании JavaFX? – user2909180

ответ

1

Этот ответ собирается скрыть и показать строки GridPane, а не добавлять и удалять их, поскольку я думаю, что разумнее не создавать новые объекты каждый раз при выборе MenuItem.

Я привел пример, который содержит GridPane и Button (а не MenuItem, но он имеет такую ​​же функцию здесь). При нажатии кнопки отображаются первые две строки из .

Я использовал RowConstraints класс: Я добавил три RowConstraints для GridPane, а затем на кнопку нажать maxHeightProperty из первых двух ограничений устанавливаются в 0 (шкуру) или 30 (шоу).

public class Main extends Application { 

    private SimpleBooleanProperty expanded = new SimpleBooleanProperty(true); 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 


      VBox vbox = new VBox(); 


      GridPane grid = new GridPane(); 
      // Just to see that the lines are actually added 
      grid.setGridLinesVisible(true); 
      grid.setPrefWidth(200); 

      grid.getRowConstraints().add(new RowConstraints(30)); 
      grid.getRowConstraints().add(new RowConstraints(30)); 

      grid.addRow(2, new Label("I am fixed!")); 
      grid.getRowConstraints().add(new RowConstraints(30)); 



      Button showOrHideButton = new Button(); 
      showOrHideButton.setOnAction((e) -> { 
       expanded.set(expanded.not().get()); 
      }); 


      vbox.getChildren().addAll(showOrHideButton, grid); 

      expanded.addListener((obs, oldVal, newVal) -> { 
       if(newVal) { 
        grid.getRowConstraints().get(0).setMaxHeight(30); 
        grid.getRowConstraints().get(1).setMaxHeight(30); 
        showOrHideButton.setText("Hide"); 
       } else { 
        grid.getRowConstraints().get(0).setMaxHeight(0); 
        grid.getRowConstraints().get(1).setMaxHeight(0); 
        showOrHideButton.setText("Show"); 
       } 
      }); 

      expanded.set(false); 


      root.setCenter(vbox); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

Он производит что-то вроде этого:

enter image description here

+0

Большое спасибо! Поэтому у меня были некоторые проблемы, чтобы заставить его работать, поэтому я изменил его на две отдельные кнопки, 1 шоу и 1 скрыть. И добавьте действие на кнопки. Он делает правильную вещь на кнопке show. В режиме скрытия он удаляет 2 строки, но сохраняет 1 строку выше. Затем он застревает в исключении – user2909180

+0

Пожалуйста, обновите вопрос, а не опубликуйте ответ с обновлением. И когда вы обновляете вопрос, напишите весь код, который у вас есть. – DVarga

+0

Получил его на работу. Пытался добавить X столбцов в каждую строку: grid.add (new Label (""), count, i); где count - цикл for, i - индекс строки. Не приведет к созданию правильного результата. Есть ли способ добавить столбцы X в RowConstraints()? – user2909180

0

Большое спасибо! Поэтому у меня были некоторые проблемы, чтобы заставить его работать, поэтому я изменил его на две отдельные кнопки, 1 шоу и 1 скрыть. И добавьте действие на кнопки. Он делает правильную вещь на кнопке show. На спрямлении он удаляет 2 строки, но держит 1 строку выше, не уверен, почему. Тогда он застрял в исключении.

@FXML 
private void add_act(ActionEvent event) { 
    SimpleBooleanProperty expanded = new SimpleBooleanProperty(true); 

     // Just to see that the lines are actually added 
     grid.setGridLinesVisible(true); 

     grid.getRowConstraints().add(new RowConstraints(30)); //add 1 row 
     grid.getRowConstraints().add(new RowConstraints(30)); //add 1 row 

     grid.addRow(2, new Label("I am fixed!")); //on index 2 write label 

     show.setOnAction((e) -> { 
      expanded.set(expanded.not().get()); 
     }); 

} 

@FXML 
private void hide_act(ActionEvent event) { 
    SimpleBooleanProperty expanded = new SimpleBooleanProperty(true); 

     // Just to see that the lines are actually added 
     grid.getRowConstraints().get(0).setMaxHeight(0); 
     grid.getRowConstraints().get(1).setMaxHeight(0); 

     show.setOnAction((e) -> { 
      expanded.set(expanded.not().get()); 
     }); 
} 

А также мне нужно отслеживать, какой индекс строки добавлен или удален. Вероятно, сделано с помощью: setRowIndex (кнопка, 1), setColumnIndex (кнопка, 2), setConstraints (label, 3, 1); // column = 3 row = 1

Смежные вопросы