2013-08-07 50 views
5

Tôi có một ScrollPane trong cảnh của tôi và muốn thêm một loạt các nút vào đó. Số tiền chính xác phải là động. Tôi đã thử nghiệm khái niệm với các nút Label và có thể thêm thành công nhiều Nhãn như tôi muốn nội dung của ScrollPane (hiện tại là một VBox).JavaFX - Thêm các nút vào ScrollPane với hướng cuộn chính xác

Vấn đề của tôi là tìm hiểu cách cho phép người dùng cuộn bình thường thông qua ScrollPane đầy đủ các nút. Nội dung phù hợp với tốc độ với thanh cuộn; tức là, khi tôi cuộn xuống, nội dung sẽ di chuyển xuống. Tôi cuộn lên, nội dung cuộn lên. Vì vậy, nếu tôi có 10 Nhãn, chỉ năm nhãn hiện đang hiển thị, hành động theo bản năng để xem năm nhãn khác sẽ là cuộn xuống. Thật không may, điều này chỉ di chuyển toàn bộ nội dung xuống, phơi bày không gian trống lên trên và ẩn nhiều nhãn hơn.

tôi có thể gửi một số mẫu mã nếu giúp, nhưng các ý chính của kế hoạch của tôi về cuộc tấn công là thế này:

ScrollPane sp = new ScrollPane(); 
VBox content = new VBox(); 
sp.setContent(content); 
for (int i = 0; i < 10; i++) 
{ 
    Label label = new Label("Label " + i); 
    content.setPrefHeight(content.getPrefHeight() + label.getPrefHeight()); 
    content.getChildren().add(label); 
} 

Bởi vì tôi sử dụng một VBox, Nhãn được xếp chồng lên nhau (ở trên trục Y) trên đỉnh một khác, đó là những gì tôi muốn. Khi nhiều Nhãn được thêm vào, thanh cuộn cần phản ánh kích thước tăng của VBox. Tôi đã thử một số phương pháp để làm việc này, bao gồm phương pháp ScrollPane.setVmax(), điều này là ổn, nhưng tôi vẫn gặp vấn đề về hướng cuộn di chuyển nội dung theo hướng sai. Tôi cũng đã thử một số EventHandlerEventFilter để sửa đổi các giá trị tương ứng, vẫn không giải quyết được vấn đề cuộn không di chuyển nội dung theo đúng hướng.

Câu trả lời có vẻ rất đơn giản, nhưng nó vẫn tiếp tục né tránh tôi, ngay cả sau nhiều giờ làm rối tung xung quanh với mã.

CHỈNH SỬA:

đề nghị của jewelsea sử dụng ListView giải quyết được sự cố của tôi. Tuy nhiên, tôi vẫn tò mò về lý do tại sao sử dụng một số ScrollPane không được tốt lắm. Ngoài ra, tôi đã chạy vào hành vi kỳ lạ với việc triển khai ListView: Tôi sử dụng nút để thêm một Label mới theo cách thủ công vào chế độ xem. Từ bây giờ trở đi, chế độ xem sẽ đóng băng sau khi thêm Label mới. Nó sẽ khóa trong vài giây trước khi cập nhật vị trí cuộn hoặc hiển thị Label mới được thêm vào. Tôi không biết nếu điều này là bởi vì có khoảng 20 hoặc hơn Label trường hợp được quản lý bởi quan điểm hoặc nếu một cái gì đó xảo quyệt hơn là lúc chơi.

+2

Bất kỳ lý do nào không sử dụng 'ListView' để thực hiện điều này? Tôi nghĩ rằng nó có thể chăm sóc những loại vấn đề cho bạn. – jewelsea

+2

@jewelsea, bạn đã giải quyết nó! Tôi luôn ngạc nhiên trước cách phần lớn các vấn đề này có vẻ quá lớn nhưng giải pháp của họ rất đơn giản. Tôi đã có thể sử dụng một 'ListView

Trả lời

0

Về vấn đề scrollpane, tôi biết những gì bạn đang tìm kiếm là có thể bởi vì tôi đang làm một cái gì đó rất giống nhau. Dựa trên đoạn mã bạn đã đưa ra ở trên, tôi sẽ đề xuất thử vài thứ ...

  • Đặt chiều cao và chiều rộng ưa thích cho ScrollPane.
  • Không cung cấp nội dung VBox bất kỳ tùy chọn kích thước chiều cao nào vì nó sẽ phát triển với nội dung của nó. Không cần phải cập nhật chiều cao của nó sau khi thêm nội dung.
  • Sử dụng setAlignment phương pháp của VBox để gắn kết nội dung của nó hoặc TOP_LEFT, TOP_CENTER, hoặc TOP_RIGHT.
  • Hãy thận trọng khi sử dụng getPrefHeight() phương pháp bởi vì nếu bạn chưa sử dụng setPrefHeight() trước tôi tin rằng nó sẽ trở lại -1.

Hy vọng điều này sẽ giúp bạn!

+0

Trong khi nó không nằm trong đoạn mã trên, tôi đã thiết lập kích thước của ScrollPane một cách rõ ràng (trong Trình tạo cảnh và mã của tôi). Tôi cũng bật tắt giữa rối tung với chiều cao của nội dung, và tôi đã có một sự liên kết được chỉ định. Tôi đã có thể thêm những thứ tốt sau khi một số rối tung hơn xung quanh, nhưng tôi vẫn không thể di chuyển theo cách tôi muốn. –