在ScrollPane和缩放组内部时,JavaFX TabPane无法呈现

时间:2016-02-28 15:19:35

标签: javafx tabs scrollview javafx-8

我需要一组小部件,包括一个TabPane,在可滚动和可缩放的视图中,基本上是这样的:

 ScrollPane[ Group[ widgets .. including TabPane ] ]

ScrollPane显然需要滚动,并且该组包含所有小部件并支持缩放。

该方法的最初问题是ScrollPane根据小部件的原始大小显示滚动条,而不是基于实际大小。

note how scroll bars

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

网站https://pixelduke.wordpress.com/2012/09/16/zooming-inside-a-scrollpane解释了如何通过添加另一个嵌套组来解决这个问题:

ScrollPane[ Group[ Group[ widgets .. including TabPane ] ] ]

与以前一样,内部组拥有所有小部件并支持缩放。 外部组自动获取缩放的布局边界 内部组中的小部件,允许ScrollPane正确配置滚动条。

..但现在TabPane将无法正确绘制自己。 你看到的只是TabPane的红色背景:

missing tab pane content

完整的标签页面只有在某种程度上被迫刷新时才会显示。 示例代码切换了' side'按“'空格'。”选项卡窗格的属性。

Tabs drawn after 'SPACE' toggles the 'side'

现在我拥有了所有内容:Tab Pane绘制正常,内部组可以缩放,一旦缩放的内容不再适合视口,就会出现滚动条。但是必须强制使用Tab Pane刷新肯定是一个黑客。

Scrolls bars are OK

我的场景图中是否有错误?

这是TabPane渲染中的错误吗?

问题当然似乎仅限于TabPane。当我将其他组,矩形,按钮,文本节点添加到'小部件'在内部组中,它们都很好。只有TabPane拒绝显示其标签。

尝试使用JDK 1.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);
    }
}

0 个答案:

没有答案