2015-03-23 3 views
2

Я новичок в JavaFx, для моего приложения мне нужно установить неопределенный набор кнопок на части экрана. Поскольку я не знаю, сколько кнопок мне нужно, пока программа не запустится, я подумал о том, чтобы установить эту часть экрана ScrollPane и добавить динамически связку HBox, содержащую кнопки (я использую Список <> кнопок и Список <> из HBox, так что я могу создать новый HBox для каждых 8 кнопок).Каков наилучший способ добавить кучу кнопки в ScrollPane?

Идея заключается в использовании ScrollPane для прокрутки между различными HBox, которая содержит кнопки, так что мне не нужно, чтобы всегда показывать все кнопки. Проблема в том, что кажется, что вы не можете добавить непосредственно пучок HBox в ScrollPane. В любом случае, чтобы выполнить это? Мой код будет выглядеть примерно так:

public void startApp(int nDetect){ 
    this.primaryStage = new Stage(); 
    this.nDetect = nDetect; 
    BorderPane bp = new BorderPane(); 

    Group root = new Group(); 
    . 
    . 
    . 
    LinkedList<Button> buttons = new LinkedList<>(); 
    LinkedList<HBox> boxes = new LinkedList<>(); 

    for(int i=0; i<this.nDetect; i++) { 
     if(i%8 == 0){ 
      boxes.add(new HBox()); 
      boxes.get(i/8).setSpacing(5); 
     } 
     boxes.get(i/8).getChildren().add(buttons.get(i)) //add the button to the appropriate HBox 
    } 

    ScrollPane spane = new ScrollPane(); 

    for(HBox h : boxes){ 
     //add every element in "boxes" to the ScrollPane 
    } 
    bp.setTop(spane); 
    root.getChildren().add(bp); 
} 

ответ

2

Похоже, вы хотите, чтобы ваши кнопки были размещены внутри сетки в области прокрутки.

Соответствующий макет для этого будет GridPane.

button grid

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class ButtonLinesInScrollPane extends Application { 

    private static final double BUTTONS_PER_LINE = 8; 
    private static final double NUM_BUTTON_LINES = 8; 
    private static final double BUTTON_PADDING = 5; 

    @Override 
    public void start(Stage stage) { 
     GridPane grid = new GridPane(); 
     grid.setPadding(new Insets(BUTTON_PADDING)); 
     grid.setHgap(BUTTON_PADDING); 
     grid.setVgap(BUTTON_PADDING); 

     for (int r = 0; r < NUM_BUTTON_LINES; r++) { 
      for (int c = 0; c < BUTTONS_PER_LINE; c++) { 
       Button button = new Button(r + ":" + c); 
       grid.add(button, c, r); 
      } 
     } 

     ScrollPane scrollPane = new ScrollPane(grid); 

     stage.setScene(new Scene(scrollPane)); 
     stage.show(); 
    } 

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

Спасибо, это было так просто, как – Juan

2

ScrollPane оборачивает другой Node. Просто сделайте один HBox (или VBox), установите это как содержимое области прокрутки и добавьте все Button s к коробке. Коробка автоматически масштабируется, и панель прокрутки будет иметь тот же размер, но автоматически будет рисовать горизонтальные и/или вертикальные слайдеры по мере того, как контент будет расти за пределы.

+0

Проблема заключается в том, что я хочу организовать кнопки в строках 8 (там всегда будет по крайней мере, линия 8 видимых кнопок, и вы должны прокрутить вниз, чтобы увидеть следующую строку из 8). Добавляя каждую кнопку в HBox и это на ScrollPane, она показывает одну строку с горизонтальной прокруткой – Juan

+0

. Затем вы должны использовать 'GridPane', как предложено @jewelsea – Warkst