2015-05-07 2 views
4

Итак, в основном, я пытаюсь достичь этого прокручиваемого набора компонентов с интервалом и т. Д. И возможностью добавлять дополнительные компоненты. Список компонентов - это пользовательские компоненты привязки.Как создать прокручиваемую панель компонентов в JavaFX?

Вот пример того, что я работаю: enter image description here

Проблема заключается в том, что это использует gridpane внутри ScrollPane и по какой-то причине gridpane не заполняет ширину ScrollPane на всех. Итак, если я изменяю размер, все остается там, где оно вместо растягивания внутри столбцов gridpane. Кроме того, если бы я должен был придерживаться gridpane (над тилепаном, который, кажется, работает лучше, если только компоненты не плавают рядом друг с другом, несмотря на то, что ориентация является вертикальной, а prefcolumn - 1), как бы я добавил несколько строк? Идея этого состоит в том, чтобы перечислить репозитории github в приятной, UX-приятной, моде.

Спасибо за понимание. Также: эти репозиции не мои - у меня их нет, а парень на веб-сайте сделал это (это не так хорошо, поэтому не сравнивайте меня с ним).

+1

Как насчет [Обогащение пользовательского интерфейса вашего списка с помощью MediaListCell] (http://www.guigarage.com/2014/09/enrich-list-ui-using-medialistcell/). В противном случае укажите код. – Roland

+0

@Roland - В настоящее время я создаю прототипы всего в построителе сцен, но я думаю, что мне, возможно, придется быстро создать пользовательские компоненты с кодом, чтобы получить функциональность, которая мне нужна. Эта ссылка интересна, хотя я буду использовать ее для другой части программы. Прямо сейчас, я просто ищу чисто решение на основе FXML. – user3530525

+1

Похоже, вы можете сделать это просто с помощью 'VBox' в' ScrollPane'. 'fillWidth =" true "' для 'VBox' и' fitToWidth = "true" 'для' ScrollPane'. Если вы хотите, чтобы 'GridPane' использовал' columnConstraints' для управления шириной. Но, создайте простой пример и отправьте некоторый код, если вы хотите получить более полный ответ. –

ответ

3

Похоже, вы должны использовать VBox, чтобы провести AnchorPane s и поместить их в ScrollPane. Установите fitToWidth на true на ScrollPane, и он должен заставить анкерные панели снимать всю ширину (и не более) окна просмотра полосы прокрутки, если вы не измените свойство maxWidth на AnchorPane по умолчанию.

Передразнивало вверх пример (который может быть легко сделано в FXML, если вы предпочитаете):

import java.util.Random; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class ScrollingVBox extends Application { 


    @Override 
    public void start(Stage primaryStage) { 

     final Random rng = new Random(); 
     VBox content = new VBox(5); 
     ScrollPane scroller = new ScrollPane(content); 
     scroller.setFitToWidth(true); 

     Button addButton = new Button("Add"); 
     addButton.setOnAction(e -> { 
      AnchorPane anchorPane = new AnchorPane(); 
      String style = String.format("-fx-background: rgb(%d, %d, %d);"+ 
        "-fx-background-color: -fx-background;", 
        rng.nextInt(256), 
        rng.nextInt(256), 
        rng.nextInt(256)); 
      anchorPane.setStyle(style); 
      Label label = new Label("Pane "+(content.getChildren().size()+1)); 
      AnchorPane.setLeftAnchor(label, 5.0); 
      AnchorPane.setTopAnchor(label, 5.0); 
      Button button = new Button("Remove"); 
      button.setOnAction(evt -> content.getChildren().remove(anchorPane)); 
      AnchorPane.setRightAnchor(button, 5.0); 
      AnchorPane.setTopAnchor(button, 5.0); 
      AnchorPane.setBottomAnchor(button, 5.0); 
      anchorPane.getChildren().addAll(label, button); 
      content.getChildren().add(anchorPane); 
     }); 

     Scene scene = new Scene(new BorderPane(scroller, null, null, addButton, null), 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

Другим решением может быть использование ListView. (Это было бы предпочтительнее, если бы у вас было много элементов для отображения.) Создайте класс, представляющий элементы, которые вы показываете в каждом AnchorPane, и пользовательскую ячейку списка для их отображения.

+0

Очень полезно, спасибо кучу! – user3530525

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