1 /* 2 * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package hello; 27 28 import javafx.application.Application; 29 import javafx.beans.InvalidationListener; 30 import javafx.beans.Observable; 31 import javafx.collections.ListChangeListener; 32 import javafx.event.ActionEvent; 33 import javafx.event.Event; 34 import javafx.event.EventHandler; 35 import javafx.geometry.Insets; 36 import javafx.geometry.NodeOrientation; 37 import javafx.geometry.Side; 38 import javafx.scene.Group; 39 import javafx.scene.Scene; 40 import javafx.scene.control.Button; 41 import javafx.scene.control.ContextMenu; 42 import javafx.scene.control.Label; 43 import javafx.scene.control.MenuItem; 44 import javafx.scene.control.Tab; 45 import javafx.scene.control.TabPane; 46 import javafx.scene.control.TextArea; 47 import javafx.scene.control.TextField; 48 import javafx.scene.control.ToggleButton; 49 import javafx.scene.control.ToggleGroup; 50 import javafx.scene.control.Tooltip; 51 import javafx.scene.image.Image; 52 import javafx.scene.image.ImageView; 53 import javafx.scene.input.MouseEvent; 54 import javafx.scene.layout.FlowPane; 55 import javafx.scene.layout.Region; 56 import javafx.scene.layout.StackPane; 57 import javafx.scene.layout.HBox; 58 import javafx.scene.layout.VBox; 59 import javafx.scene.paint.Color; 60 import javafx.scene.shape.Rectangle; 61 import javafx.stage.Stage; 62 63 64 public class HelloTabPane extends Application { 65 66 private TabPane tabPane; 67 private Tab tab1; 68 private Tab tab2; 69 private Tab tab3; 70 private Tab emptyTab; 71 private Tab internalTab; 72 private Tab multipleTabs; 73 private Tab tabForDragPolicy; 74 private ContextMenu menu; 75 76 private boolean showScrollArrows = false; 77 private boolean showTabMenu = false; 78 79 public static void main(String[] args) { 80 Application.launch(args); 81 } 82 83 @Override public void start(Stage stage) { 84 tabPane = new TabPane(); 85 tab1 = new Tab(); 86 tab2 = new Tab(); 87 tab3 = new Tab(); 88 emptyTab = new Tab(); 89 internalTab = new Tab(); 90 multipleTabs = new Tab(); 91 tabForDragPolicy = new Tab(); 92 setUpPopupMenu(); 93 stage.setTitle("Hello TabPane2"); 94 final Scene scene = new Scene(new Group(), 800, 800); 95 scene.setFill(Color.GHOSTWHITE); 96 97 98 tabPane.prefWidthProperty().bind(scene.widthProperty()); 99 tabPane.prefHeightProperty().bind(scene.heightProperty()); 100 101 tabPane.setRotateGraphic(false); 102 tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.SELECTED_TAB); 103 tabPane.setSide(Side.TOP); 104 105 { 106 tab1.setText("Tab 1"); 107 tab1.setTooltip(new Tooltip("Tab 1 Tooltip")); 108 final Image image = new Image(getClass().getResourceAsStream("about_16.png")); 109 final ImageView imageView = new ImageView(); 110 imageView.setImage(image); 111 tab1.setGraphic(imageView); 112 final VBox vbox = new VBox(); 113 vbox.setSpacing(10); 114 vbox.setTranslateX(10); 115 vbox.setTranslateY(10); 116 { 117 final Button b = new Button("Toggle Tab Mode"); 118 b.setOnAction(new EventHandler<ActionEvent>() { 119 @Override public void handle(ActionEvent e) { 120 toggleTabMode(tabPane); 121 } 122 }); 123 vbox.getChildren().add(b); 124 } 125 { 126 final Button b = new Button("Toggle Tab Position"); 127 b.setOnAction(new EventHandler<ActionEvent>() { 128 @Override public void handle(ActionEvent e) { 129 toggleTabPosition(tabPane); 130 } 131 }); 132 vbox.getChildren().add(b); 133 } 134 { 135 final Button b = new Button("Switch to Empty Tab"); 136 b.setOnAction(new EventHandler<ActionEvent>() { 137 @Override public void handle(ActionEvent e) { 138 tabPane.getSelectionModel().select(emptyTab); 139 } 140 }); 141 vbox.getChildren().add(b); 142 } 143 { 144 final Button b = new Button("Switch to New Tab"); 145 b.setOnAction(new EventHandler<ActionEvent>() { 146 @Override public void handle(ActionEvent e) { 147 Tab t = new Tab(); 148 t.setText("Testing"); 149 t.setContent(new Button("Howdy")); 150 tabPane.getTabs().add(t); 151 tabPane.getSelectionModel().select(t); 152 } 153 }); 154 vbox.getChildren().add(b); 155 } 156 { 157 final Button b = new Button("Add Tab"); 158 b.setOnAction(new EventHandler<ActionEvent>() { 159 @Override public void handle(ActionEvent e) { 160 Tab t = new Tab(); 161 t.setText("New Tab"); 162 t.setContent(new Region()); 163 tabPane.getTabs().add(t); 164 } 165 }); 166 vbox.getChildren().add(b); 167 } 168 { 169 final Button b = new Button("Toggle Popup on Empty Tab"); 170 b.setOnAction(new EventHandler<ActionEvent>() { 171 @Override public void handle(ActionEvent e) { 172 if (emptyTab.getContextMenu() == null) { 173 emptyTab.setContextMenu(menu); 174 } else { 175 emptyTab.setContextMenu(null); 176 } 177 } 178 }); 179 vbox.getChildren().add(b); 180 } 181 { 182 ToggleButton tb = new ToggleButton("Show scroll arrows"); 183 tb.setSelected(showScrollArrows); 184 tb.selectedProperty().addListener(new InvalidationListener() { 185 public void invalidated(Observable ov) { 186 showScrollArrows = !showScrollArrows; 187 } 188 }); 189 vbox.getChildren().add(tb); 190 } 191 { 192 ToggleButton tb = new ToggleButton("Show Tab Menu Button"); 193 tb.setSelected(showTabMenu); 194 tb.selectedProperty().addListener(new InvalidationListener() { 195 public void invalidated(Observable ov) { 196 showTabMenu = !showTabMenu; 197 } 198 }); 199 vbox.getChildren().add(tb); 200 } 201 tab1.setContent(vbox); 202 tabPane.getTabs().add(tab1); 203 } 204 { 205 tab2.setText("Longer Tab"); 206 final Image image = new Image(getClass().getResourceAsStream("folder_16.png")); 207 final ImageView imageView = new ImageView(); 208 imageView.setImage(image); 209 tab2.setGraphic(imageView); 210 final VBox vbox = new VBox(); 211 vbox.setSpacing(10); 212 vbox.setTranslateX(10); 213 vbox.setTranslateY(10); 214 215 final ToggleGroup closingPolicy = new ToggleGroup(); 216 for (TabPane.TabClosingPolicy policy: TabPane.TabClosingPolicy.values()) { 217 final ToggleButton button = new ToggleButton(policy.name()); 218 button.setToggleGroup(closingPolicy); 219 button.selectedProperty().addListener(new InvalidationListener() { 220 public void invalidated(Observable ov) { 221 tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.valueOf(button.getText())); 222 } 223 }); 224 vbox.getChildren().add(button); 225 } 226 227 final ToggleButton rotateGraphics = new ToggleButton("Rotate Graphics"); 228 rotateGraphics.selectedProperty().addListener(new InvalidationListener() { 229 public void invalidated(Observable ov) { 230 tabPane.setRotateGraphic(rotateGraphics.isSelected()); 231 } 232 }); 233 vbox.getChildren().add(rotateGraphics); 234 235 tab2.setContent(vbox); 236 tabPane.getTabs().add(tab2); 237 } 238 { 239 tab3.setText("Tab 3"); 240 final Image image = new Image(getClass().getResourceAsStream("heart_16.png")); 241 final ImageView imageView = new ImageView(); 242 imageView.setImage(image); 243 tab3.setGraphic(imageView); 244 final VBox vbox = new VBox(); 245 vbox.setSpacing(10); 246 vbox.setTranslateX(10); 247 vbox.setTranslateY(10); 248 { 249 final ToggleButton tb = new ToggleButton("Show Labels"); 250 tb.setSelected(true); 251 tb.selectedProperty().addListener(new InvalidationListener() { 252 public void invalidated(Observable ov) { 253 if (tb.isSelected()) { 254 tab1.setText("Tab 1"); 255 tab2.setText("Tab 2"); 256 tab3.setText("Tab 3"); 257 } else { 258 tab1.setText(""); 259 tab2.setText(""); 260 tab3.setText(""); 261 } 262 } 263 }); 264 vbox.getChildren().add(tb); 265 } 266 { 267 final ToggleButton tb = new ToggleButton("Big Graphic 1"); 268 tb.selectedProperty().addListener(new InvalidationListener() { 269 public void invalidated(Observable ov) { 270 Image image; 271 if (tb.isSelected()) { 272 image = new Image(getClass().getResourceAsStream("about_48.png")); 273 } else { 274 image = new Image(getClass().getResourceAsStream("about_16.png")); 275 } 276 ImageView imageView = new ImageView(); 277 imageView.setImage(image); 278 tab1.setGraphic(imageView); 279 } 280 }); 281 vbox.getChildren().add(tb); 282 } 283 { 284 final ToggleButton tb = new ToggleButton("Big Graphic 2"); 285 tb.selectedProperty().addListener(new InvalidationListener() { 286 public void invalidated(Observable ov) { 287 Image image; 288 if (tb.isSelected()) { 289 image = new Image(getClass().getResourceAsStream("folder_48.png")); 290 } else { 291 image = new Image(getClass().getResourceAsStream("folder_16.png")); 292 } 293 ImageView imageView = new ImageView(); 294 imageView.setImage(image); 295 tab2.setGraphic(imageView); 296 } 297 }); 298 vbox.getChildren().add(tb); 299 } 300 { 301 final ToggleButton tb = new ToggleButton("Big Graphic 3"); 302 tb.selectedProperty().addListener(new InvalidationListener() { 303 public void invalidated(Observable ov) { 304 Image image; 305 if (tb.isSelected()) { 306 image = new Image(getClass().getResourceAsStream("heart_48.png")); 307 } else { 308 image = new Image(getClass().getResourceAsStream("heart_16.png")); 309 } 310 ImageView imageView = new ImageView(); 311 imageView.setImage(image); 312 tab3.setGraphic(imageView); 313 } 314 }); 315 vbox.getChildren().add(tb); 316 } 317 tab3.setContent(vbox); 318 tabPane.getTabs().add(tab3); 319 } 320 { 321 tabForDragPolicy.setText("TabDragPolicy"); 322 tabForDragPolicy.setContent(setupDragPolicyTab()); 323 tabPane.getTabs().add(tabForDragPolicy); 324 } 325 326 emptyTab.setText("Empty Tab"); 327 emptyTab.setContent(new Region()); 328 tabPane.getTabs().add(emptyTab); 329 330 emptyTab.setOnSelectionChanged(new EventHandler<Event>() { 331 public void handle(Event t) { 332 System.out.println("Empty tab selected"); 333 } 334 }); 335 336 emptyTab.setOnClosed(new EventHandler<Event>() { 337 public void handle(Event t) { 338 System.out.println("Empty tab closed"); 339 } 340 }); 341 342 internalTab.setText("Internal Tab"); 343 setupInternalTab(); 344 tabPane.getTabs().add(internalTab); 345 346 multipleTabs.setText("Multiple Tabs"); 347 setupMultipleInteralTabs(); 348 tabPane.getTabs().add(multipleTabs); 349 350 { 351 Tab tab = new Tab(); 352 tab.setText("Tab 4"); 353 tab.setClosable(false); 354 tab.setContent(new Region()); 355 tabPane.getTabs().add(tab); 356 } 357 358 for (int i = 5; i < 9; i++) { 359 Tab tab = new Tab(); 360 tab.setText("Tab " + i); 361 tab.setContent(new Region()); 362 tabPane.getTabs().add(tab); 363 } 364 ((Group)scene.getRoot()).getChildren().add(tabPane); 365 stage.setScene(scene); 366 stage.show(); 367 } 368 369 private VBox setupDragPolicyTab() { 370 Label indexErr = new Label(""); 371 Label angleErr = new Label(""); 372 VBox mainContent = new VBox(); 373 mainContent.setSpacing(20); 374 mainContent.setMinSize(1000, 400); 375 376 TabPane tabPane = new TabPane(); 377 tabPane.setMinSize(500, 400); 378 tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); 379 HBox tabs = new HBox(); 380 tabs.getChildren().add(tabPane); 381 mainContent.getChildren().add(tabs); 382 383 for (int i = 0; i < 7; ++i) { 384 String text = i + " "; 385 HBox hb = new HBox(); 386 Tab tab = new Tab(text); 387 TextArea ta = new TextArea("" + i + i + i + i); 388 ta.setStyle("-fx-max-width: 300; -fx-max-height: 100;"); 389 hb.getChildren().add(ta); 390 tab.setContent(hb); 391 tabPane.getTabs().add(tab); 392 } 393 394 TextArea instructions = new TextArea( 395 "**** INSTRUCTIONS ****\n\n" + 396 "1. TabDragPolicy.FIXED : Default policy.\n" + 397 "Click the FIXED button to set FIXED TabDragPolicy.\n" + 398 "The tabs remain fixed & tab headers cannot be dragged to reorder.\n\n" + 399 "2. TabDragPolicy.REORDER :\n" + 400 "Click the REORDER button to set REORDER TabDragPolicy.\n" + 401 "The tabs can be reordered with mouse press & drag action on tab header.\n\n" + 402 "3. With each of the drag policy,\n" + 403 "Choose different combinations of\n" + 404 "sides (TOP or BOTTOM or LEFT or RIGHT),\n" + 405 "node orientations, (LTR or RTL) and\n" + 406 "different rotation angle.\n\n" + 407 "4. Perform reordering and verify the correctness of the\n" + 408 "printed Current order of tabs and permuted tabs.\n" + 409 "And verify the navigation of tabs using left, right arrow keys.\n\n" + 410 "5. Additionally, also verify the outputs with ADD, REMOVE\n" + 411 "and REVERSE buttons." 412 ); 413 tabs.getChildren().add(instructions); 414 415 Label permuted = new Label("Permuted tabs : "); 416 Label outputPermutedTabs = new Label(); 417 Label added = new Label("Added : "); 418 Label outputAddedTabs = new Label(); 419 Label removed = new Label("Removed : "); 420 Label outputRemovedTabs = new Label(); 421 Label getTabs = new Label("Current order of Tabs : "); 422 Label outputListOfTabs = new Label(); 423 tabPane.setOnMousePressed(event -> { 424 outputPermutedTabs.setText(""); 425 outputAddedTabs.setText(""); 426 outputRemovedTabs.setText(""); 427 outputListOfTabs.setText(""); 428 angleErr.setText(""); 429 indexErr.setText(""); 430 }); 431 VBox notifications = new VBox(); 432 notifications.setSpacing(15); 433 notifications.setStyle("-fx-border-color: black"); 434 notifications.setPadding(new Insets(20)); 435 HBox permut = new HBox(); 436 permut.getChildren().addAll(permuted, outputPermutedTabs); 437 438 HBox adds = new HBox(); 439 adds.getChildren().addAll(added, outputAddedTabs); 440 441 HBox removes = new HBox(); 442 removes.getChildren().addAll(removed, outputRemovedTabs); 443 444 HBox allTabs = new HBox(); 445 allTabs.getChildren().addAll(getTabs, outputListOfTabs); 446 notifications.getChildren().addAll(permut, adds, removes, allTabs); 447 mainContent.getChildren().add(notifications); 448 449 tabPane.getTabs().addListener((ListChangeListener<Tab>) c -> { 450 while (c.next()) { 451 String list = ""; 452 outputPermutedTabs.setText(""); 453 outputAddedTabs.setText(""); 454 outputRemovedTabs.setText(""); 455 for (int i = c.getFrom(); i < c.getTo(); i++) { 456 list += tabPane.getTabs().get(i).getText() + ", "; 457 } 458 459 if (c.wasPermutated()) { 460 outputPermutedTabs.setText(list); 461 } else if (c.wasAdded()) { 462 outputAddedTabs.setText(list); 463 } else if (c.wasRemoved()) { 464 list = ""; 465 for (Tab t : c.getRemoved()) { 466 list += t.getText() + ", "; 467 } 468 outputRemovedTabs.setText(list); 469 } 470 list = ""; 471 for (Tab t : tabPane.getTabs()) { 472 list += t.getText() + ", "; 473 } 474 outputListOfTabs.setText(list); 475 } 476 }); 477 478 HBox bottomBox = new HBox(); 479 bottomBox.setSpacing(15); 480 bottomBox.setPadding(new Insets(20)); 481 bottomBox.setStyle("-fx-border-color: black"); 482 483 VBox addRemove = new VBox(); 484 addRemove.setSpacing(5); 485 Button add = new Button("ADD"); 486 Button remove = new Button("REMOVE"); 487 HBox indexContainer = new HBox(); 488 Label indexLabel = new Label("Index: "); 489 TextField indexTF = new TextField("0"); 490 indexTF.setMaxWidth(50); 491 indexContainer.getChildren().addAll(indexLabel, indexTF); 492 addRemove.getChildren().add(new Label("Add / Remove index")); 493 addRemove.getChildren().add(indexContainer); 494 addRemove.getChildren().add(add); 495 addRemove.getChildren().add(remove); 496 addRemove.getChildren().add(indexErr); 497 498 499 add.setOnMouseClicked(event -> { 500 try { 501 int index = Integer.parseInt(indexTF.getText()); 502 if (index >= 0 && index < tabPane.getTabs().size()) { 503 tabPane.getTabs().add(index, new Tab(index + "--- ")); 504 tabPane.requestFocus(); 505 } 506 indexErr.setText(""); 507 } catch (Exception e) { 508 indexErr.setText("Incorrect Index"); 509 } 510 }); 511 remove.setOnMouseClicked(event -> { 512 try { 513 int index = Integer.parseInt(indexTF.getText()); 514 if (index >= 0 && index < tabPane.getTabs().size()) { 515 tabPane.getTabs().remove(index); 516 tabPane.requestFocus(); 517 } 518 indexErr.setText(""); 519 } catch (Exception e) { 520 indexErr.setText("Incorrect Index"); 521 } 522 }); 523 524 bottomBox.getChildren().add(addRemove); 525 526 ToggleGroup side = new ToggleGroup(); 527 528 ToggleButton top = new ToggleButton("TOP"); 529 top.setSelected(true); 530 top.setUserData(Side.TOP); 531 ToggleButton bottom = new ToggleButton("BOTTOM"); 532 bottom.setUserData(Side.BOTTOM); 533 ToggleButton left = new ToggleButton("LEFT"); 534 left.setUserData(Side.LEFT); 535 ToggleButton right = new ToggleButton("RIGHT"); 536 right.setUserData(Side.RIGHT); 537 538 top.setToggleGroup(side); 539 bottom.setToggleGroup(side); 540 left.setToggleGroup(side); 541 right.setToggleGroup(side); 542 543 side.selectedToggleProperty().addListener(observable -> { 544 if (side.getSelectedToggle() == null) { 545 tabPane.setSide(Side.TOP); 546 } else { 547 tabPane.setSide((Side) side.getSelectedToggle().getUserData()); 548 } 549 tabPane.requestFocus(); 550 }); 551 552 VBox sides = new VBox(); 553 sides.setSpacing(5); 554 sides.getChildren().add(new Label("Sides")); 555 sides.getChildren().add(top); 556 sides.getChildren().add(bottom); 557 sides.getChildren().add(left); 558 sides.getChildren().add(right); 559 bottomBox.getChildren().add(sides); 560 561 ToggleGroup dragPolicy = new ToggleGroup(); 562 dragPolicy.selectedToggleProperty().addListener(observable -> { 563 if (dragPolicy.getSelectedToggle() == null) { 564 tabPane.setTabDragPolicy(TabPane.TabDragPolicy.FIXED); 565 } else { 566 tabPane.setTabDragPolicy((TabPane.TabDragPolicy) dragPolicy.getSelectedToggle().getUserData()); 567 } 568 tabPane.requestFocus(); 569 }); 570 571 ToggleButton reorder = new ToggleButton("REORDER"); 572 reorder.setUserData(TabPane.TabDragPolicy.REORDER); 573 reorder.setToggleGroup(dragPolicy); 574 ToggleButton fixed = new ToggleButton("FIXED"); 575 fixed.setSelected(true); 576 fixed.setUserData(TabPane.TabDragPolicy.FIXED); 577 fixed.setToggleGroup(dragPolicy); 578 579 VBox dragPolicies = new VBox(); 580 dragPolicies.setSpacing(5); 581 dragPolicies.getChildren().add(new Label("Drag Policies")); 582 dragPolicies.getChildren().add(reorder); 583 dragPolicies.getChildren().add(fixed); 584 bottomBox.getChildren().add(dragPolicies); 585 586 ToggleGroup orientation = new ToggleGroup(); 587 orientation.selectedToggleProperty().addListener(observable -> { 588 if (orientation.getSelectedToggle() == null) { 589 tabPane.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT); 590 } else { 591 tabPane.setNodeOrientation((NodeOrientation) orientation.getSelectedToggle().getUserData()); 592 } 593 tabPane.requestFocus(); 594 }); 595 596 ToggleButton ltr = new ToggleButton("LEFT TO RIGHT"); 597 ltr.setSelected(true); 598 ltr.setUserData(NodeOrientation.LEFT_TO_RIGHT); 599 ltr.setToggleGroup(orientation); 600 ToggleButton rtl = new ToggleButton("RIGHT TO LEFT"); 601 rtl.setUserData(NodeOrientation.RIGHT_TO_LEFT); 602 rtl.setToggleGroup(orientation); 603 VBox orientations = new VBox(); 604 orientations.setSpacing(5); 605 orientations.getChildren().add(new Label("Node Orientations")); 606 orientations.getChildren().add(ltr); 607 orientations.getChildren().add(rtl); 608 bottomBox.getChildren().add(orientations); 609 610 HBox angleContainer = new HBox(); 611 Label angleLabel = new Label("Angle: "); 612 TextField angleTF = new TextField("0"); 613 angleTF.setMaxWidth(50); 614 angleContainer.getChildren().addAll(angleLabel, angleTF); 615 Label rotLabel = new Label("Rotate TabPane"); 616 Button rotate = new Button("ROTATE"); 617 rotate.setOnMouseClicked(event -> { 618 try { 619 tabPane.setRotate(Float.parseFloat(angleTF.getText())); 620 angleErr.setText(""); 621 } catch (Exception e) { 622 angleErr.setText("Incorrect Angle"); 623 } 624 tabPane.requestFocus(); 625 }); 626 VBox rotation = new VBox(); 627 rotation.setSpacing(5); 628 rotation.getChildren().addAll(rotLabel, angleContainer, rotate, angleErr); 629 bottomBox.getChildren().add(rotation); 630 631 Label reverseLabel = new Label("Reverse order of tabs"); 632 Button reverse = new Button("REVERSE"); 633 reverse.setOnMouseClicked(event -> { 634 tabPane.getTabs().sort((o1, o2) -> { 635 if (tabPane.getTabs().indexOf(o1) > tabPane.getTabs().indexOf(o2)) { 636 return -1; 637 } else { 638 return 1; 639 } 640 }); 641 tabPane.requestFocus(); 642 }); 643 VBox revContainer = new VBox(); 644 revContainer.setSpacing(5); 645 revContainer.getChildren().addAll(reverseLabel, reverse); 646 bottomBox.getChildren().add(revContainer); 647 648 bottomBox.setOnMousePressed(event -> { 649 angleErr.setText(""); 650 indexErr.setText(""); 651 }); 652 mainContent.getChildren().add(bottomBox); 653 return mainContent; 654 } 655 656 private void setupInternalTab() { 657 StackPane internalTabContent = new StackPane(); 658 659 Rectangle r = new Rectangle(700, 500); 660 r.setFill(Color.LIGHTSTEELBLUE); 661 internalTabContent.getChildren().add(r); 662 663 final TabPane internalTabPane = new TabPane(); 664 internalTabPane.getStyleClass().add(TabPane.STYLE_CLASS_FLOATING); 665 internalTabPane.setSide(Side.LEFT); 666 internalTabPane.setPrefSize(500, 500); 667 { 668 final Tab tab = new Tab(); 669 tab.setText("Tab 1"); 670 final VBox vbox = new VBox(); 671 vbox.setSpacing(10); 672 vbox.setTranslateX(10); 673 vbox.setTranslateY(10); 674 { 675 Button b = new Button("Toggle Tab Position"); 676 b.setOnAction(new EventHandler<ActionEvent>() { 677 @Override public void handle(ActionEvent e) { 678 toggleTabPosition(internalTabPane); 679 } 680 }); 681 vbox.getChildren().add(b); 682 } 683 { 684 Button b = new Button("Toggle Tab Mode"); 685 b.setOnAction(new EventHandler<ActionEvent>() { 686 @Override public void handle(ActionEvent e) { 687 toggleTabMode(internalTabPane); 688 } 689 }); 690 vbox.getChildren().add(b); 691 } 692 tab.setContent(vbox); 693 internalTabPane.getTabs().add(tab); 694 } 695 { 696 final Tab tab = new Tab(); 697 tab.setText("Tab 2"); 698 final VBox vbox = new VBox(); 699 vbox.setSpacing(10); 700 vbox.setTranslateX(10); 701 vbox.setTranslateY(10); 702 Button b = new Button("Button 2"); 703 vbox.getChildren().add(b); 704 tab.setContent(vbox); 705 internalTabPane.getTabs().add(tab); 706 } 707 { 708 final Tab tab = new Tab(); 709 tab.setText("Tab 3"); 710 final VBox vbox = new VBox(); 711 vbox.setSpacing(10); 712 vbox.setTranslateX(10); 713 vbox.setTranslateY(10); 714 Button b = new Button("Button 3"); 715 vbox.getChildren().add(b); 716 tab.setContent(vbox); 717 internalTabPane.getTabs().add(tab); 718 } 719 for (int i = 4; i < 10; i++) { 720 Tab tab = new Tab(); 721 tab.setText("Tab " + i); 722 tab.setContent(new Region()); 723 internalTabPane.getTabs().add(tab); 724 } 725 internalTabContent.getChildren().add(internalTabPane); 726 internalTab.setContent(internalTabContent); 727 } 728 729 private void setupMultipleInteralTabs() { 730 String tabStrings[] = { "Labrador", "Poodle", "Boxer"/*, "Great Dane"*/ }; 731 FlowPane flow = new FlowPane(); 732 flow.setHgap(20); 733 flow.setVgap(20); 734 flow.setPrefWrapLength(500); 735 736 TabPane internalTabPane = new TabPane(); 737 for(String tabstring : tabStrings) { 738 Tab tab = new Tab(); 739 tab.setText(tabstring); 740 StackPane stack = new StackPane(); 741 Rectangle rect = new Rectangle(200,200, Color.LIGHTSTEELBLUE); 742 stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring)); 743 tab.setContent(stack); 744 internalTabPane.getTabs().add(tab); 745 } 746 flow.getChildren().add(internalTabPane); 747 748 internalTabPane = new TabPane(); 749 internalTabPane.setSide(Side.RIGHT); 750 for(String tabstring : tabStrings) { 751 Tab tab = new Tab(); 752 tab.setText(tabstring); 753 StackPane stack = new StackPane(); 754 Rectangle rect = new Rectangle(200,200, Color.ANTIQUEWHITE); 755 stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring)); 756 tab.setContent(stack); internalTabPane.getTabs().add(tab); 757 } 758 flow.getChildren().add(internalTabPane); 759 760 internalTabPane = new TabPane(); 761 internalTabPane.setSide(Side.BOTTOM); 762 for(String tabstring : tabStrings) { 763 Tab tab = new Tab(); 764 tab.setText(tabstring); 765 StackPane stack = new StackPane(); 766 Rectangle rect = new Rectangle(200,200, Color.YELLOWGREEN); 767 stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring)); 768 tab.setContent(stack); internalTabPane.getTabs().add(tab); 769 } 770 flow.getChildren().add(internalTabPane); 771 772 internalTabPane = new TabPane(); 773 internalTabPane.setSide(Side.LEFT); 774 for(String tabstring : tabStrings) { 775 Tab tab = new Tab(); 776 tab.setText(tabstring); 777 StackPane stack = new StackPane(); 778 Rectangle rect = new Rectangle(200,200, Color.RED); 779 stack.getChildren().addAll(rect, new Button(" A type of dog: "+tabstring)); 780 tab.setContent(stack); internalTabPane.getTabs().add(tab); 781 } 782 flow.getChildren().add(internalTabPane); 783 multipleTabs.setContent(flow); 784 } 785 786 private void toggleTabPosition(TabPane tabPane) { 787 Side pos = tabPane.getSide(); 788 if (pos == Side.TOP) { 789 tabPane.setSide(Side.RIGHT); 790 } else if (pos == Side.RIGHT) { 791 tabPane.setSide(Side.BOTTOM); 792 } else if (pos == Side.BOTTOM) { 793 tabPane.setSide(Side.LEFT); 794 } else { 795 tabPane.setSide(Side.TOP); 796 } 797 } 798 799 private void toggleTabMode(TabPane tabPane) { 800 if (!tabPane.getStyleClass().contains(TabPane.STYLE_CLASS_FLOATING)) { 801 tabPane.getStyleClass().add(TabPane.STYLE_CLASS_FLOATING); 802 } else { 803 tabPane.getStyleClass().remove(TabPane.STYLE_CLASS_FLOATING); 804 } 805 } 806 807 private void setUpPopupMenu() { 808 menu = new ContextMenu(); 809 menu.getItems().add(new MenuItem("Item 1")); 810 menu.getItems().add(new MenuItem("Item 2")); 811 menu.getItems().add(new MenuItem("Item 3")); 812 menu.getItems().add(new MenuItem("Item 4")); 813 menu.getItems().add(new MenuItem("Item 5")); 814 menu.getItems().add(new MenuItem("Item 6")); 815 } 816 } 817