Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX TabPane在滚动窗格和缩放组内时无法呈现_Javafx_Tabs_Scrollview_Javafx 8 - Fatal编程技术网

JavaFX TabPane在滚动窗格和缩放组内时无法呈现

JavaFX TabPane在滚动窗格和缩放组内时无法呈现,javafx,tabs,scrollview,javafx-8,Javafx,Tabs,Scrollview,Javafx 8,我需要一组小部件,包括一个选项卡窗格,在一个可滚动和可缩放的视图中,基本上如下所示: ScrollPane[ Group[ widgets .. including TabPane ] ] 滚动显然需要滚动窗格,该组包含所有小部件并支持缩放 这种方法的最初问题是滚动窗格根据小部件的原始大小而不是实际大小显示滚动条 在屏幕截图中,请注意滚动条是如何显示的,即使选项卡窗格比视口小得多,因此不需要滚动条 该网站解释了如何通过添加另一个嵌套组来解决此问题: ScrollPane[ Group[ G

我需要一组小部件,包括一个选项卡窗格,在一个可滚动和可缩放的视图中,基本上如下所示:

 ScrollPane[ Group[ widgets .. including TabPane ] ]
滚动显然需要滚动窗格,该组包含所有小部件并支持缩放

这种方法的最初问题是滚动窗格根据小部件的原始大小而不是实际大小显示滚动条

在屏幕截图中,请注意滚动条是如何显示的,即使选项卡窗格比视口小得多,因此不需要滚动条

该网站解释了如何通过添加另一个嵌套组来解决此问题:

ScrollPane[ Group[ Group[ widgets .. including TabPane ] ] ]
与前面一样,内部组保存所有小部件并支持缩放。 外部组将自动获取缩放的对象的布局边界 内部组中的小部件,允许滚动窗格正确配置滚动条

。。但是现在TabPane将无法正确地绘制自己。 您只看到选项卡窗格的红色背景:

“完整”选项卡窗格仅在以某种方式强制刷新时显示。 示例代码在按“空格”键时切换选项卡窗格的“侧”属性

现在我拥有了一切:选项卡窗格绘制正常,内部组可以缩放,一旦缩放的内容不再适合视口,滚动条就会出现。但必须强制刷新选项卡窗格肯定是一种黑客行为

我的场景图中有错误吗

这是选项卡窗格渲染中的错误吗

问题显然只限于选项卡窗格。当我将其他组、矩形、按钮、文本节点添加到内部组中的“小部件”时,它们都呈现良好。只有选项卡窗格拒绝显示其选项卡

在JDK1.8.0_51和1.8.0_73上都尝试过这个,在Windows、Linux和Mac OS X上也尝试过

import javafx.application.Application;
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class TabDemo extends Application
{
    @Override
    public void start(final Stage stage)
    {
        // TabPane with some tabs
        final TabPane tabs = new TabPane();
        tabs.setStyle("-fx-background-color: red;");
        for (int i=0; i<3; ++i)
        {
            final Rectangle rect = new Rectangle(i*100, 100, 10+i*100, 20+i*80);
            rect.setFill(Color.BLUE);
            final Pane content = new Pane(rect);
            final Tab tab = new Tab("Tab " + (i+1), content);
            tab.setClosable(false);
            tabs.getTabs().add(tab);
        }
        tabs.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
        tabs.setPrefSize(400, 300);

        final Group widgets = new Group(tabs);
        widgets.setScaleX(0.5);
        widgets.setScaleY(0.5);
        final Group scroll_content = new Group(widgets);
        final ScrollPane scroll = new ScrollPane(scroll_content);
        final Scene scene = new Scene(scroll);
        stage.setTitle("Tab Demo");
        stage.setScene(scene);
        stage.show();

        // Unfortunately, the setup of ScrollPane -> Group -> Group -> TabPane
        // breaks the rendering of the TabPane.
        // While the red background shows the area occupied by TabPane,
        // the actual Tabs are missing..
        System.out.println("See anything?");
        scene.addEventFilter(KeyEvent.KEY_PRESSED, (KeyEvent event) ->
        {
            if (event.getCode() == KeyCode.SPACE)
            {   // .. until 'side' or 'tabMinWidth' or .. are twiddled to force a refresh
                tabs.setSide(Side.BOTTOM);
                tabs.setSide(Side.TOP);
                System.out.println("See it now?");
            }
        });
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.geometry.Side;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.Region;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类TabDemo扩展了应用程序
{
@凌驾
公共作废开始(最后阶段)
{
//带有一些选项卡的选项卡窗格
final TabPane tabs=新TabPane();
tabs.setStyle(“-fx背景色:红色;”);
对于(int i=0;i组->组->选项卡窗格
//中断选项卡窗格的呈现。
//红色背景显示TabPane占据的区域,
//缺少实际选项卡。。
System.out.println(“看到什么了吗?”);
scene.addEventFilter(按下KeyEvent.KEY_,(KeyEvent事件)->
{
if(event.getCode()==KeyCode.SPACE)
{/..直到旋转'side'或'tabMinWidth'或..以强制刷新
制表符。设置侧(侧。底部);
制表符。设置侧(侧。顶部);
System.out.println(“现在看到了吗?”);
}
});
}
公共静态void main(字符串[]args)
{
发射(args);
}
}

有什么解决方案吗,我的朋友?没有进展。我现在只能通过调用
setSide
来强制重新绘制选项卡窗格,方法是先调用不同的值,然后调用所需的值。