< prev index next >
apps/toys/Hello/src/main/java/hello/HelloTabPane.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 26,68 ****
--- 26,78 ----
package hello;
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
+ import javafx.collections.ListChangeListener;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
+ import javafx.geometry.Insets;
+ import javafx.geometry.NodeOrientation;
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
+ import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
+ import javafx.scene.control.TextArea;
+ import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
+ import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
+ import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
+
public class HelloTabPane extends Application {
private TabPane tabPane;
private Tab tab1;
private Tab tab2;
private Tab tab3;
private Tab emptyTab;
private Tab internalTab;
private Tab multipleTabs;
+ private Tab tabForDragPolicy;
private ContextMenu menu;
private boolean showScrollArrows = false;
private boolean showTabMenu = false;
*** 76,85 ****
--- 86,96 ----
tab2 = new Tab();
tab3 = new Tab();
emptyTab = new Tab();
internalTab = new Tab();
multipleTabs = new Tab();
+ tabForDragPolicy = new Tab();
setUpPopupMenu();
stage.setTitle("Hello TabPane2");
final Scene scene = new Scene(new Group(), 800, 800);
scene.setFill(Color.GHOSTWHITE);
*** 304,313 ****
--- 315,329 ----
vbox.getChildren().add(tb);
}
tab3.setContent(vbox);
tabPane.getTabs().add(tab3);
}
+ {
+ tabForDragPolicy.setText("TabDragPolicy");
+ tabForDragPolicy.setContent(setupDragPolicyTab());
+ tabPane.getTabs().add(tabForDragPolicy);
+ }
emptyTab.setText("Empty Tab");
emptyTab.setContent(new Region());
tabPane.getTabs().add(emptyTab);
*** 348,357 ****
--- 364,660 ----
((Group)scene.getRoot()).getChildren().add(tabPane);
stage.setScene(scene);
stage.show();
}
+ private VBox setupDragPolicyTab() {
+ Label indexErr = new Label("");
+ Label angleErr = new Label("");
+ VBox mainContent = new VBox();
+ mainContent.setSpacing(20);
+ mainContent.setMinSize(1000, 400);
+
+ TabPane tabPane = new TabPane();
+ tabPane.setMinSize(500, 400);
+ tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS);
+ HBox tabs = new HBox();
+ tabs.getChildren().add(tabPane);
+ mainContent.getChildren().add(tabs);
+
+ for (int i = 0; i < 7; ++i) {
+ String text = i + " ";
+ HBox hb = new HBox();
+ Tab tab = new Tab(text);
+ TextArea ta = new TextArea("" + i + i + i + i);
+ ta.setStyle("-fx-max-width: 300; -fx-max-height: 100;");
+ hb.getChildren().add(ta);
+ tab.setContent(hb);
+ tabPane.getTabs().add(tab);
+ }
+
+ TextArea instructions = new TextArea(
+ "**** INSTRUCTIONS ****\n\n" +
+ "1. TabDragPolicy.FIXED : Default policy.\n" +
+ "Click the FIXED button to set FIXED TabDragPolicy.\n" +
+ "The tabs remain fixed & tab headers cannot be dragged to reorder.\n\n" +
+ "2. TabDragPolicy.REORDER :\n" +
+ "Click the REORDER button to set REORDER TabDragPolicy.\n" +
+ "The tabs can be reordered with mouse press & drag action on tab header.\n\n" +
+ "3. With each of the drag policy,\n" +
+ "Choose different combinations of\n" +
+ "sides (TOP or BOTTOM or LEFT or RIGHT),\n" +
+ "node orientations, (LTR or RTL) and\n" +
+ "different rotation angle.\n\n" +
+ "4. Perform reordering and verify the correctness of the\n" +
+ "printed Current order of tabs and permuted tabs.\n" +
+ "And verify the navigation of tabs using left, right arrow keys.\n\n" +
+ "5. Additionally, also verify the outputs with ADD, REMOVE\n" +
+ "and REVERSE buttons."
+ );
+ tabs.getChildren().add(instructions);
+
+ Label permuted = new Label("Permuted tabs : ");
+ Label outputPermutedTabs = new Label();
+ Label added = new Label("Added : ");
+ Label outputAddedTabs = new Label();
+ Label removed = new Label("Removed : ");
+ Label outputRemovedTabs = new Label();
+ Label getTabs = new Label("Current order of Tabs : ");
+ Label outputListOfTabs = new Label();
+ tabPane.setOnMousePressed(event -> {
+ outputPermutedTabs.setText("");
+ outputAddedTabs.setText("");
+ outputRemovedTabs.setText("");
+ outputListOfTabs.setText("");
+ angleErr.setText("");
+ indexErr.setText("");
+ });
+ VBox notifications = new VBox();
+ notifications.setSpacing(15);
+ notifications.setStyle("-fx-border-color: black");
+ notifications.setPadding(new Insets(20));
+ HBox permut = new HBox();
+ permut.getChildren().addAll(permuted, outputPermutedTabs);
+
+ HBox adds = new HBox();
+ adds.getChildren().addAll(added, outputAddedTabs);
+
+ HBox removes = new HBox();
+ removes.getChildren().addAll(removed, outputRemovedTabs);
+
+ HBox allTabs = new HBox();
+ allTabs.getChildren().addAll(getTabs, outputListOfTabs);
+ notifications.getChildren().addAll(permut, adds, removes, allTabs);
+ mainContent.getChildren().add(notifications);
+
+ tabPane.getTabs().addListener((ListChangeListener<Tab>) c -> {
+ while (c.next()) {
+ String list = "";
+ outputPermutedTabs.setText("");
+ outputAddedTabs.setText("");
+ outputRemovedTabs.setText("");
+ for (int i = c.getFrom(); i < c.getTo(); i++) {
+ list += tabPane.getTabs().get(i).getText() + ", ";
+ }
+
+ if (c.wasPermutated()) {
+ outputPermutedTabs.setText(list);
+ } else if (c.wasAdded()) {
+ outputAddedTabs.setText(list);
+ } else if (c.wasRemoved()) {
+ list = "";
+ for (Tab t : c.getRemoved()) {
+ list += t.getText() + ", ";
+ }
+ outputRemovedTabs.setText(list);
+ }
+ list = "";
+ for (Tab t : tabPane.getTabs()) {
+ list += t.getText() + ", ";
+ }
+ outputListOfTabs.setText(list);
+ }
+ });
+
+ HBox bottomBox = new HBox();
+ bottomBox.setSpacing(15);
+ bottomBox.setPadding(new Insets(20));
+ bottomBox.setStyle("-fx-border-color: black");
+
+ VBox addRemove = new VBox();
+ addRemove.setSpacing(5);
+ Button add = new Button("ADD");
+ Button remove = new Button("REMOVE");
+ HBox indexContainer = new HBox();
+ Label indexLabel = new Label("Index: ");
+ TextField indexTF = new TextField("0");
+ indexTF.setMaxWidth(50);
+ indexContainer.getChildren().addAll(indexLabel, indexTF);
+ addRemove.getChildren().add(new Label("Add / Remove index"));
+ addRemove.getChildren().add(indexContainer);
+ addRemove.getChildren().add(add);
+ addRemove.getChildren().add(remove);
+ addRemove.getChildren().add(indexErr);
+
+
+ add.setOnMouseClicked(event -> {
+ try {
+ int index = Integer.parseInt(indexTF.getText());
+ if (index >= 0 && index < tabPane.getTabs().size()) {
+ tabPane.getTabs().add(index, new Tab(index + "--- "));
+ tabPane.requestFocus();
+ }
+ indexErr.setText("");
+ } catch (Exception e) {
+ indexErr.setText("Incorrect Index");
+ }
+ });
+ remove.setOnMouseClicked(event -> {
+ try {
+ int index = Integer.parseInt(indexTF.getText());
+ if (index >= 0 && index < tabPane.getTabs().size()) {
+ tabPane.getTabs().remove(index);
+ tabPane.requestFocus();
+ }
+ indexErr.setText("");
+ } catch (Exception e) {
+ indexErr.setText("Incorrect Index");
+ }
+ });
+
+ bottomBox.getChildren().add(addRemove);
+
+ ToggleGroup side = new ToggleGroup();
+
+ ToggleButton top = new ToggleButton("TOP");
+ top.setSelected(true);
+ top.setUserData(Side.TOP);
+ ToggleButton bottom = new ToggleButton("BOTTOM");
+ bottom.setUserData(Side.BOTTOM);
+ ToggleButton left = new ToggleButton("LEFT");
+ left.setUserData(Side.LEFT);
+ ToggleButton right = new ToggleButton("RIGHT");
+ right.setUserData(Side.RIGHT);
+
+ top.setToggleGroup(side);
+ bottom.setToggleGroup(side);
+ left.setToggleGroup(side);
+ right.setToggleGroup(side);
+
+ side.selectedToggleProperty().addListener(observable -> {
+ if (side.getSelectedToggle() == null) {
+ tabPane.setSide(Side.TOP);
+ } else {
+ tabPane.setSide((Side) side.getSelectedToggle().getUserData());
+ }
+ tabPane.requestFocus();
+ });
+
+ VBox sides = new VBox();
+ sides.setSpacing(5);
+ sides.getChildren().add(new Label("Sides"));
+ sides.getChildren().add(top);
+ sides.getChildren().add(bottom);
+ sides.getChildren().add(left);
+ sides.getChildren().add(right);
+ bottomBox.getChildren().add(sides);
+
+ ToggleGroup dragPolicy = new ToggleGroup();
+ dragPolicy.selectedToggleProperty().addListener(observable -> {
+ if (dragPolicy.getSelectedToggle() == null) {
+ tabPane.setTabDragPolicy(TabPane.TabDragPolicy.FIXED);
+ } else {
+ tabPane.setTabDragPolicy((TabPane.TabDragPolicy) dragPolicy.getSelectedToggle().getUserData());
+ }
+ tabPane.requestFocus();
+ });
+
+ ToggleButton reorder = new ToggleButton("REORDER");
+ reorder.setUserData(TabPane.TabDragPolicy.REORDER);
+ reorder.setToggleGroup(dragPolicy);
+ ToggleButton fixed = new ToggleButton("FIXED");
+ fixed.setSelected(true);
+ fixed.setUserData(TabPane.TabDragPolicy.FIXED);
+ fixed.setToggleGroup(dragPolicy);
+
+ VBox dragPolicies = new VBox();
+ dragPolicies.setSpacing(5);
+ dragPolicies.getChildren().add(new Label("Drag Policies"));
+ dragPolicies.getChildren().add(reorder);
+ dragPolicies.getChildren().add(fixed);
+ bottomBox.getChildren().add(dragPolicies);
+
+ ToggleGroup orientation = new ToggleGroup();
+ orientation.selectedToggleProperty().addListener(observable -> {
+ if (orientation.getSelectedToggle() == null) {
+ tabPane.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT);
+ } else {
+ tabPane.setNodeOrientation((NodeOrientation) orientation.getSelectedToggle().getUserData());
+ }
+ tabPane.requestFocus();
+ });
+
+ ToggleButton ltr = new ToggleButton("LEFT TO RIGHT");
+ ltr.setSelected(true);
+ ltr.setUserData(NodeOrientation.LEFT_TO_RIGHT);
+ ltr.setToggleGroup(orientation);
+ ToggleButton rtl = new ToggleButton("RIGHT TO LEFT");
+ rtl.setUserData(NodeOrientation.RIGHT_TO_LEFT);
+ rtl.setToggleGroup(orientation);
+ VBox orientations = new VBox();
+ orientations.setSpacing(5);
+ orientations.getChildren().add(new Label("Node Orientations"));
+ orientations.getChildren().add(ltr);
+ orientations.getChildren().add(rtl);
+ bottomBox.getChildren().add(orientations);
+
+ HBox angleContainer = new HBox();
+ Label angleLabel = new Label("Angle: ");
+ TextField angleTF = new TextField("0");
+ angleTF.setMaxWidth(50);
+ angleContainer.getChildren().addAll(angleLabel, angleTF);
+ Label rotLabel = new Label("Rotate TabPane");
+ Button rotate = new Button("ROTATE");
+ rotate.setOnMouseClicked(event -> {
+ try {
+ tabPane.setRotate(Float.parseFloat(angleTF.getText()));
+ angleErr.setText("");
+ } catch (Exception e) {
+ angleErr.setText("Incorrect Angle");
+ }
+ tabPane.requestFocus();
+ });
+ VBox rotation = new VBox();
+ rotation.setSpacing(5);
+ rotation.getChildren().addAll(rotLabel, angleContainer, rotate, angleErr);
+ bottomBox.getChildren().add(rotation);
+
+ Label reverseLabel = new Label("Reverse order of tabs");
+ Button reverse = new Button("REVERSE");
+ reverse.setOnMouseClicked(event -> {
+ tabPane.getTabs().sort((o1, o2) -> {
+ if (tabPane.getTabs().indexOf(o1) > tabPane.getTabs().indexOf(o2)) {
+ return -1;
+ } else {
+ return 1;
+ }
+ });
+ tabPane.requestFocus();
+ });
+ VBox revContainer = new VBox();
+ revContainer.setSpacing(5);
+ revContainer.getChildren().addAll(reverseLabel, reverse);
+ bottomBox.getChildren().add(revContainer);
+
+ bottomBox.setOnMousePressed(event -> {
+ angleErr.setText("");
+ indexErr.setText("");
+ });
+ mainContent.getChildren().add(bottomBox);
+ return mainContent;
+ }
+
private void setupInternalTab() {
StackPane internalTabContent = new StackPane();
Rectangle r = new Rectangle(700, 500);
r.setFill(Color.LIGHTSTEELBLUE);
< prev index next >