我需要一组小部件,包括一个TabPane,在可滚动和可缩放的视图中,基本上是这样的:
ScrollPane[ Group[ widgets .. including TabPane ] ]
ScrollPane显然需要滚动,并且该组包含所有小部件并支持缩放。
该方法的最初问题是ScrollPane根据小部件的原始大小显示滚动条,而不是基于实际大小。
在屏幕截图中,请注意即使选项卡窗格比视口小得多,也会显示滚动条的显示方式,因此不需要滚动条。
网站https://pixelduke.wordpress.com/2012/09/16/zooming-inside-a-scrollpane解释了如何通过添加另一个嵌套组来解决这个问题:
ScrollPane[ Group[ Group[ widgets .. including TabPane ] ] ]
与以前一样,内部组拥有所有小部件并支持缩放。 外部组自动获取缩放的布局边界 内部组中的小部件,允许ScrollPane正确配置滚动条。
..但现在TabPane将无法正确绘制自己。 你看到的只是TabPane的红色背景:
完整的标签页面只有在某种程度上被迫刷新时才会显示。 示例代码切换了' side'按“'空格'。”选项卡窗格的属性。
现在我拥有了所有内容:Tab Pane绘制正常,内部组可以缩放,一旦缩放的内容不再适合视口,就会出现滚动条。但是必须强制使用Tab Pane刷新肯定是一个黑客。
我的场景图中是否有错误?
这是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);
}
}