2017-02-16 2 views
0

Ich arbeite gerade an einem Projekt, und ich kann keine Lösung finden. Ich möchte, dass eine Zeilenhöhe einer Gridpane dynamisch aus der Breite einer bestimmten Spalte innerhalb dieser Zeile gezählt wird. Das gesamte Gridpanel muss skalierbar sein und der Rest des verfügbaren Platzes sollte eine weitere Zeile darunter einnehmen, damit das Seitenverhältnis dieser Zelle entsprechend dem Element innerhalb dieser Zelle erhalten bleibt. Irgendwelche Ideen Jungs?JavaFX dynamic gridpane Zeilenhöhenanpassung

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

    } 

} 

Ich will Zellen 1,0 und 1,1 durch die Erhöhung der Breite, die Höhe von 0 Zeilen resizable und eindeutig sein und 1 sollte nicht in gleichem Maße zuzunehmen. Wenn es noch Höhe geben sollte, möchte ich, dass die Zeile 3 es nimmt, weil Zeile 2 nicht auf Höhe wachsen sollte.

+0

Sie sollten versuchen, Ihr Ziel allgemeiner zu erklären, da Sie davon ausgehen, dass GridPane die richtige Lösung für Ihr Problem ist, was es sein könnte oder auch nicht. –

+0

OK, ich kann es versuchen. Ich möchte, dass die Höhe einer Rasterfeldzeile dynamisch auf 1/32 Breite einer ihrer Spalten geändert wird. Wenn sich eine Breite dieser Spalte erneut ändert, möchte ich die Breite dieser Zeile neu berechnen. Ist das irgendwie möglich? – Martin123

Antwort

0

Sie haben ein gutes Stück Erklärung (was gut ist), aber es ist komplex genug, um mich 10 Mal lesen zu lassen, und ich glaube, ich habe 70% davon verstanden. Der rätselhafteste Teil ist folgende Zeile:

Der Rest des verfügbaren Speicherplatzes sollte eine weitere Zeile darunter einnehmen, damit das Seitenverhältnis dieser Zelle entsprechend dem Element in dieser Zelle erhalten bleibt.

nicht sicher, welche „Zelle“ Sie referrring, und was Sie unter Seitenverhältnis zu halten.

Jetzt für die tatsächliche Antwort, ich denke, die offensichtlichste, die ich sehen kann, ist, dass Sie Zeilen 0 und 1 ALWAYS Priorität für VGrow gegeben haben.

Sie haben 3 Zeilen, die ALWAYSVGrow hat, und was die GridPane wird, ist tun, alle Kinder zu welchem ​​Raum zu geben, dass sie, haben dann bevorzugt mit ALWAYS alle „übrig gebliebenen“ Räume zu Reihen verteilen. Aus diesem Grund haben die 3 Lücken in Ihrem Bild die gleiche Höhe.

+0

Hey, Ich denke du hast mich richtig verstanden. Ich bezog mich auf diese beiden HBoxen in den Zellen 1,0 und 1,1. Hier ist der knifflige Teil, die Höhe der Stackpanels innerhalb der Hboxes ist 1/32 der HBox selbst. Also muss die Spalte 1 immer auf die Breite wachsen, was gut ist, aber wie kann man sagen, dass die Zeilen 0 und 1 nur dann wachsen, wenn die Höhe der HBox zunimmt? Das zweite Problem wird durch die Erhöhung der Breite der gesamten Gitterplatte verursacht, Stackepanes in HBoxis wachsen kein Problem, aber die Höhe der Reihe 1 und 2 ist gleich. Hoffe, du verstehst mich und danke für die vorherige Antwort. – Martin123

Verwandte Themen