2017-02-16 7 views
0

В настоящее время я работаю над проектом, и я не могу найти ни одного решения. Я хочу, чтобы высота строки Gridpane динамически подсчитывалась из ширины одного конкретного столбца внутри этой строки. Вся Gridpane должна быть изменчиваема, а остальная часть доступного пространства должна иметь следующую строку ниже, чтобы соотношение сторон одной ячейки сохранялось в соответствии с элементом внутри этой ячейки. Любые идеи мальчиков?Настройка высоты строки динамической сетки JavaFX

click for a pic

public class GridPaneControl extends GridPane { 

    private int index; 
    private Label startLabel; 
    private Label endLabel; 

    private HBox inputCellsContainer; 
    private HBox outputCellsContainer; 

    private Button inputOutputNextButton; 
    private Button inputOutputPreviousButton; 

    public GridPaneControl() { 

     setGridLinesVisible(true); 
     initialization(); 

     ColumnConstraints cc0 = new ColumnConstraints(); 
     cc0.setMaxWidth(Double.MAX_VALUE); 
     cc0.setHgrow(Priority.NEVER); 

     ColumnConstraints cc1 = new ColumnConstraints(); 
     cc1.setMaxWidth(Double.MAX_VALUE); 

     ColumnConstraints cc2 = new ColumnConstraints(); 
     cc2.setMaxWidth(Double.MAX_VALUE); 
     cc2.setHgrow(Priority.NEVER); 

     RowConstraints rc0 = new RowConstraints(); 
     rc0.setVgrow(Priority.ALWAYS); 
     rc0.setFillHeight(false); 
     rc0.setMaxHeight(Double.MAX_VALUE); 

     RowConstraints rc1 = new RowConstraints(); 
     rc1.setVgrow(Priority.ALWAYS); 
     rc1.setFillHeight(false); 
     rc1.setMaxHeight(Double.MAX_VALUE); 

     RowConstraints rc2 = new RowConstraints(); 
     rc2.setVgrow(Priority.NEVER); 

     RowConstraints rc3 = new RowConstraints(); 
     rc3.setVgrow(Priority.ALWAYS); 

     getColumnConstraints().addAll(cc0, cc1, cc2); 
     getRowConstraints().addAll(rc0, rc1, rc2, rc3); 

    } 

    private void initialization() { 

     inputCellsContainer = new HBox(0); 
     outputCellsContainer = new HBox(0); 

     GridPane.setValignment(inputCellsContainer, VPos.BOTTOM); 
     GridPane.setValignment(outputCellsContainer, VPos.TOP); 

     inputOutputPreviousButton = new Button("<<"); 
     inputOutputPreviousButton.maxWidth(Double.MAX_VALUE); 
     GridPane.setHgrow(inputOutputPreviousButton, Priority.NEVER); 
     GridPane.setVgrow(inputOutputPreviousButton, Priority.NEVER); 
     GridPane.setMargin(inputOutputPreviousButton, new Insets(5)); 

     inputOutputNextButton = new Button(">>"); 
     inputOutputNextButton.maxWidth(Double.MAX_VALUE); 
     GridPane.setHgrow(inputOutputNextButton, Priority.NEVER); 
     GridPane.setVgrow(inputOutputNextButton, Priority.NEVER); 
     GridPane.setMargin(inputOutputNextButton, new Insets(5)); 

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

      InputOutputCell cellIn = new InputOutputCell(String.format("%02X", i), Color.AQUA, 0); 
      InputOutputCell cellOut = new InputOutputCell(String.format("%02X", i), Color.BEIGE, 1); 
      HBox.setHgrow(cellIn, Priority.ALWAYS); 
      HBox.setHgrow(cellOut, Priority.ALWAYS); 

      inputCellsContainer.getChildren().add(cellIn); 
      outputCellsContainer.getChildren().add(cellOut); 

     } 

     GridPane.setHgrow(inputCellsContainer, Priority.ALWAYS); 
     GridPane.setHgrow(outputCellsContainer, Priority.ALWAYS); 
     GridPane.setVgrow(inputCellsContainer, Priority.ALWAYS); 
     GridPane.setVgrow(outputCellsContainer, Priority.ALWAYS); 

     startLabel = new Label("0"); 
     endLabel = new Label("31"); 
     GridPane.setHalignment(startLabel, HPos.LEFT); 
     GridPane.setHalignment(endLabel, HPos.RIGHT); 

     this.add(inputOutputPreviousButton, 0, 0, 1, 2); 
     this.add(inputCellsContainer, 1, 0); 
     this.add(outputCellsContainer, 1, 1); 
     this.add(inputOutputNextButton, 2, 0, 1, 2); 
     this.add(startLabel, 1, 2); 
     this.add(endLabel, 1, 2); 

    } 

    public int getIndex() { 
     return index; 
    } 

    private class InputOutputCell extends StackPane { 

     @FXML 
     Text text; 
     @FXML 
     Rectangle rectangle; 

     public InputOutputCell(String text, Color color, int type) { 

      setMinSize(0, 0); 

      this.text = new Text(text); 
      rectangle = new Rectangle(); 


      if (type == 0) { 
       rectangle.widthProperty().bind(inputCellsContainer.widthProperty().divide(32)); 
       rectangle.heightProperty().bind(inputCellsContainer.widthProperty().divide(32)); 

      } else { 

       rectangle.widthProperty().bind(outputCellsContainer.widthProperty().divide(32)); 
       rectangle.heightProperty().bind(outputCellsContainer.widthProperty().divide(32)); 

      } 

      rectangle.maxWidth(Double.MAX_VALUE); 
      rectangle.maxHeight(Double.MAX_VALUE); 
      rectangle.setArcHeight(10); 
      rectangle.setArcWidth(10); 
      rectangle.setFill(color); 
      rectangle.setStroke(Color.BLACK); 

      getChildren().addAll(rectangle, this.text); 

     } 

     public void setText(String text) { 
      this.text.setText(text); 
     } 

     public String getText() { 
      return this.text.getText(); 
     } 

    } 

} 

Я хочу клетки 1,0 и 1,1, чтобы быть изменяемыми и четко за счет увеличения их ширина высота строки 0 и 1 не должно быть увеличение в равной степени. Если должна быть какая-то высота, я хочу, чтобы строка 3 взяла ее, потому что строка 2 не должна расти до высоты вообще.

+0

Вы должны попытаться объяснить свою цель в более общих терминах, потому что вы предполагаете, что GridPane является правильным решением вашей проблемы, чего она может или не может быть. –

+0

Хорошо, я могу попробовать. Я хочу, чтобы высота строк в сетке была динамически изменена до 1/32 ширины одного из ее столбцов. Если ширина этого столбца снова изменится, я хочу, чтобы ширина этой строки пересчитывалась. Это возможно? – Martin123

ответ

0

Вы сделали небольшое объяснение (это хорошо), но это достаточно сложно, чтобы заставить меня читать 10 раз, и я думаю, что понял 70% этого. Самая загадочная часть - это линия:

Остальное свободное пространство должно занимать еще один ряд, поэтому соотношение сторон одной ячейки сохраняется в соответствии с элементом внутри этой ячейки.

Не знаете, к какой ячейке вы обращаетесь, и что вы имеете в виду, сохраняя соотношение сторон.

Теперь, для фактического ответа, я думаю, что наиболее очевидным из которых является то, что вы указали строки 0 и 1 ALWAYS приоритет для VGrow.

У вас есть 3 строки, имеет ALWAYSVGrow и что GridPane будет делать это, чтобы дать всем детям любое пространство, что они предпочли бы иметь, а затем распределить все «оставшиеся» пробелы в строках с ALWAYS. Вот почему 3 пробела в вашем изображении имеют одинаковую высоту.

+0

Эй, Думаю, вы поняли меня правильно. Я имел в виду эти два HBoxes в ячейках 1,0 и 1,1. Вот сложная часть, высота штапенов внутри Hboxes составляет 1/32 от самого HBox. Таким образом, столбец 1 должен постоянно увеличиваться до ширины, что хорошо, но как сказать строкам 0 и 1 расти только тогда, когда высота HBox увеличивается? Вторая проблема связана с увеличением ширины всей сетки, Stackepanes в HBoxis не вызывает проблем, но высота строк 1 и 2 одинакова. Надеюсь, вы поймете меня и благодарите за предыдущий ответ. – Martin123

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

  • Нет связанных вопросов^_^