已有101人关注
为什么ScrollPane对VBox不起作用
发表在Java图书答疑 2019-08-22 悬赏:10 学分 《Java开发详解》第29章 JavaFX技术
是否精华
版块置顶:

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package graphical.core;


import java.lang.reflect.Field;

import java.util.Set;


import com.sun.javafx.scene.control.skin.ScrollPaneSkin;

import javafx.beans.Observable;

import javafx.scene.Node;

import javafx.scene.control.ContextMenu;

import javafx.scene.control.MenuItem;

import javafx.scene.control.ScrollBar;

import javafx.scene.control.ScrollPane;

import javafx.scene.control.SeparatorMenuItem;

import javafx.scene.control.Skin;

import javafx.scene.layout.Background;

import javafx.scene.layout.Priority;

import javafx.scene.layout.StackPane;

import javafx.scene.layout.VBox;


/**

 *

 * @author XiaHui

 */

public class ListRootPanel extends VBox {


public VBox box = new VBox();

ScrollPane scrollPane = new ScrollPane();


public ListRootPanel() {

initComponent();

iniEvent();

}


private void initComponent() {

scrollPane.setContent(box);

scrollPane.setPannable(true);

scrollPane.setStyle("-fx-background-color:rgba(255,255,255,0)");

scrollPane.setBackground(Background.EMPTY);

scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);

scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);

scrollPane.widthProperty().addListener((Observable observable) -> {

box.setPrefWidth(getWidth());

});


getChildren().add(scrollPane);

setUnitIncr();

}


private void iniEvent() {

setMouseTransparent(false);

setOnMouseDragged(v->{

v.consume();

});

box.setOnMouseDragged(v->{

v.consume();

});

scrollPane.setOnMouseDragged(v->{

v.consume();

});

}


public void addNode(Node node) {

if (!box.getChildren().contains(node)) {

box.getChildren().add(node);

}

}


public void addNode(int index, Node node) {

if (box.getChildren().contains(node)) {

box.getChildren().remove(node);

}

if(!box.getChildren().contains(node)){

box.getChildren().add(index,node);

}

}


public void removeNode(Node node) {

box.getChildren().remove(node);

}


public void removeNode(int index) {

box.getChildren().remove(index);

}


public void clearNode() {

box.getChildren().clear();

}


public int nodeSize() {

return box.getChildren().size();

}


private void setUnitIncr() {

try {

Skin<?> skin = scrollPane.getSkin();

if (skin instanceof ScrollPaneSkin) {

Field field = skin.getClass().getDeclaredField("vsb");

if (null != field) {

field.setAccessible(true);

ScrollBar scrollBar = (ScrollBar) field.get(skin);

field.setAccessible(false);

scrollBar.setUnitIncrement(20.0);

}

field = skin.getClass().getDeclaredField("hsb");

if (null != field) {

field.setAccessible(true);

ScrollBar scrollBar = (ScrollBar) field.get(skin);

field.setAccessible(false);

scrollBar.setUnitIncrement(20.0);

}

}

} catch (final Exception e) {

e.printStackTrace();

}


Set<Node> nodes = lookupAll(".scroll-bar");

if (null != nodes) {

for (Node node : nodes) {

if (node instanceof ScrollBar) {

ScrollBar sb = (ScrollBar) node;

sb.setUnitIncrement(20.0);

}

}

}

}

}


image.pngimage.pngimage.png



为什么滚动条不能滚动,反而随着VBox的高而变长?


分享到:
精彩评论 1
根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2019-08-22
沙发
  1. 代码的问题,滚动面板不固定,被撑大了。

  2. 这不是我们提供的代码,如果出现无法理解的写法或者bug,请咨询原作者。

首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照