Sample application that shows the use of CSS with the different layout panes provided by the JavaFX layout API.
/*
* Copyright (c) 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package layoutsamplecss;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
/**
* Sample application that shows the use of CSS with the different layout panes
* provided by the JavaFX layout API.
* The resulting UI is for demonstration purposes only and is not interactive.
*/
public class LayoutSampleCSS extends Application {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(LayoutSampleCSS.class, args);
}
@Override
public void start(Stage stage) {
// Use a border pane as the root for scene
BorderPane border = new BorderPane();
// Create HBox for use here and with stack pane
HBox hbox = addHBox();
border.setTop(hbox);
border.setLeft(addVBox());
// Add a stack to the HBox in the top region
addStackPane(hbox);
// Choose either a TilePane or FlowPane for right region and comment out the
// one you aren't using
border.setRight(addFlowPane());
// border.setRight(addTilePane());
// Add an anchor pane with a grid pane and HBox to the center region
border.setCenter(addAnchorPane(addGridPane()));
Scene scene = new Scene(border,587,415);
// Add a style sheet to the scene
scene.getStylesheets().add("layoutsamplecss/layoutstyles.css");
stage.setScene(scene);
stage.setTitle("Layout Sample");
stage.show();
}
/*
* Creates an HBox with two buttons for the top region
*/
private HBox addHBox() {
HBox hbox = new HBox();
// hbox.setPadding(new Insets(15, 12, 15, 12));
// hbox.setSpacing(10); // Gap between nodes
// hbox.setStyle("-fx-background-color: #336699;");
// Use style class to set properties previously set above (with some changes)
hbox.getStyleClass().add("hbox");
Button buttonCurrent = new Button("Current");
buttonCurrent.setPrefSize(100, 20);
Button buttonProjected = new Button("Projected");
buttonProjected.setPrefSize(100, 20);
hbox.getChildren().addAll(buttonCurrent, buttonProjected);
return hbox;
}
/*
* Creates a VBox with a list of links for the left region
*/
private VBox addVBox() {
VBox vbox = new VBox();
// vbox.setPadding(new Insets(10)); // Set all sides to 10
// vbox.setSpacing(8); // Gap between nodes
// Use style classes to set properties previously set above
vbox.getStyleClass().addAll("pane", "vbox");
Text title = new Text("Data");
title.setFont(Font.font("Arial", FontWeight.BOLD, 14));
vbox.getChildren().add(title);
Hyperlink options[] = new Hyperlink[] {
new Hyperlink("Sales"),
new Hyperlink("Marketing"),
new Hyperlink("Distribution"),
new Hyperlink("Costs")};
for (int i=0; i<4; i++) {
// Add offset to left side to indent from title
VBox.setMargin(options[i], new Insets(0, 0, 0, 8));
vbox.getChildren().add(options[i]);
}
return vbox;
}
/*
* Uses a stack pane to create a help icon and adds it to the right side of an HBox
*
* @param hb HBox to add the stack to
*/
private void addStackPane(HBox hb) {
StackPane stack = new StackPane();
Rectangle helpIcon = new Rectangle(30.0, 25.0);
helpIcon.setFill(new LinearGradient(0,0,0,1, true, CycleMethod.NO_CYCLE,
new Stop[]{
new Stop(0,Color.web("#4977A3")),
new Stop(0.5, Color.web("#B0C6DA")),
new Stop(1,Color.web("#9CB6CF")),}));
helpIcon.setStroke(Color.web("#D0E6FA"));
helpIcon.setArcHeight(3.5);
helpIcon.setArcWidth(3.5);
Text helpText = new Text("?");
helpText.setFont(Font.font("Verdana", FontWeight.BOLD, 18));
helpText.setFill(Color.WHITE);
helpText.setStroke(Color.web("#7080A0"));
stack.getChildren().addAll(helpIcon, helpText);
stack.setAlignment(Pos.CENTER_RIGHT);
// Add offset to right for question mark to compensate for RIGHT
// alignment of all nodes
StackPane.setMargin(helpText, new Insets(0, 10, 0, 0));
hb.getChildren().add(stack);
HBox.setHgrow(stack, Priority.ALWAYS);
}
/*
* Creates a grid for the center region with four columns and three rows
*/
private GridPane addGridPane() {
GridPane grid = new GridPane();
// grid.setHgap(10);
// grid.setVgap(10);
// grid.setPadding(new Insets(0, 10, 0, 10));
// Use style classes to set properties previously set above (with some changes)
grid.getStyleClass().add("grid");
// Category in column 2, row 1
Text category = new Text("Sales:");
category.setFont(Font.font("Arial", FontWeight.BOLD, 20));
grid.add(category, 1, 0);
// Title in column 3, row 1
Text chartTitle = new Text("Current Year");
chartTitle.setFont(Font.font("Arial", FontWeight.BOLD, 20));
grid.add(chartTitle, 2, 0);
// Subtitle in columns 2-3, row 2
Text chartSubtitle = new Text("Goods and Services");
grid.add(chartSubtitle, 1, 1, 2, 1);
// House icon in column 1, rows 1-2
ImageView imageHouse = new ImageView(
new Image(LayoutSampleCSS.class.getResourceAsStream("graphics/house.png")));
grid.add(imageHouse, 0, 0, 1, 2);
// Left label in column 1 (bottom), row 3
Text goodsPercent = new Text("Goods\n80%");
GridPane.setValignment(goodsPercent, VPos.BOTTOM);
grid.add(goodsPercent, 0, 2);
// Chart in columns 2-3, row 3
ImageView imageChart = new ImageView(
new Image(LayoutSampleCSS.class.getResourceAsStream("graphics/piechart.png")));
grid.add(imageChart, 1, 2, 2, 1);
// Right label in column 4 (top), row 3
Text servicesPercent = new Text("Services\n20%");
GridPane.setValignment(servicesPercent, VPos.TOP);
grid.add(servicesPercent, 3, 2);
// grid.setGridLinesVisible(true);
return grid;
}
/*
* Creates a horizontal flow pane with eight icons in four rows
*/
private FlowPane addFlowPane() {
FlowPane flow = new FlowPane();
// flow.setPadding(new Insets(5, 0, 5, 0));
// flow.setVgap(4);
// flow.setHgap(4);
// flow.setStyle("-fx-background-color: DAE6F3;");
// Use style classes to set properties previously set above
flow.getStyleClass().addAll("pane", "flow-tile");
flow.setPrefWrapLength(170); // preferred width allows for two columns
ImageView pages[] = new ImageView[8];
for (int i=0; i<8; i++) {
pages[i] = new ImageView(
new Image(LayoutSampleCSS.class.getResourceAsStream(
"graphics/chart_"+(i+1)+".png")));
flow.getChildren().add(pages[i]);
}
return flow;
}
/*
* Creates a horizontal (default) tile pane with eight icons in four rows
*/
private TilePane addTilePane() {
TilePane tile = new TilePane();
// tile.setPadding(new Insets(5, 0, 5, 0));
// tile.setVgap(4);
// tile.setHgap(4);
// tile.setStyle("-fx-background-color: DAE6F3;");
// Use style classes to set properties previously set above (with some changes)
tile.getStyleClass().addAll("pane", "flow-tile");
tile.setPrefColumns(2);
ImageView pages[] = new ImageView[8];
for (int i=0; i<8; i++) {
pages[i] = new ImageView(
new Image(LayoutSampleCSS.class.getResourceAsStream(
"graphics/chart_"+(i+1)+".png")));
tile.getChildren().add(pages[i]);
}
return tile;
}
/*
* Creates an anchor pane using the provided grid and an HBox with buttons
*
* @param grid Grid to anchor to the top of the anchor pane
*/
private AnchorPane addAnchorPane(GridPane grid) {
AnchorPane anchorpane = new AnchorPane();
anchorpane.getStyleClass().add("pane");
Button buttonSave = new Button("Save");
buttonSave.setId("button-custom");
Button buttonCancel = new Button("Cancel");
buttonCancel.setId("button-custom");
HBox hb = new HBox();
// hb.setPadding(new Insets(0, 10, 10, 10));
// hb.setSpacing(10);
// Use style classes to set properties previously set above (with some changes)
hb.getStyleClass().add("hbox");
hb.setId("hbox-custom");
hb.getChildren().addAll(buttonSave, buttonCancel);
anchorpane.getChildren().addAll(grid,hb);
// Anchor buttons to bottom right, anchor grid to top
AnchorPane.setBottomAnchor(hb, 8.0);
AnchorPane.setRightAnchor(hb, 5.0);
AnchorPane.setTopAnchor(grid, 10.0);
return anchorpane;
}
}
/*
* Copyright (c) 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Style sheet for Layout Sample
*/
.pane {
-fx-background-color: #8fbc8f;
}
.grid {
-fx-background-color: white;
-fx-background-radius: 5.0;
-fx-background-insets: 0.0 5.0 0.0 5.0;
-fx-padding: 10;
-fx-hgap: 10;
-fx-vgap: 10;
}
.vbox {
/* -fx-background-image: url("graphics/arrow_t_up_right.png");
-fx-background-size: 96, 205;
-fx-background-repeat: no-repeat;*/
-fx-border-color: #2e8b57;
-fx-border-width: 2px;
-fx-padding: 10;
-fx-spacing: 8;
}
.hbox {
-fx-background-color: #2f4f4f;
-fx-padding: 15;
-fx-spacing: 10;
}
#hbox-custom {
/* -fx-background-image: url("graphics/cloud.png");
-fx-background-size: 60,69;
-fx-padding: 18 3 18 6;*/
-fx-padding: 8;
-fx-background-radius: 5.0;
}
.flow-tile {
-fx-padding: 10.0 3.0 5.0 0.0;
-fx-hgap: 4;
-fx-vgap: 4;
}
#button-custom {
/* -fx-rotate: 45;*/
-fx-text-alignment: center;
}
Related examples in the same category
1. | Using CSS to style the border | | |
2. | Connect to CSS Style Sheet in same Package | | |
3. | Connect to CSS Style Sheet in another Package | | |
4. | Set CSS style | | |
5. | -fx-stroke: green; | | |
6. | -fx-stroke-width: 5; | | |
7. | -fx-stroke-dash-array: 12 2 4 2; | | |
8. | -fx-stroke-dash-offset: 6; | | |
9. | -fx-stroke-line-cap: butt; | | |
10. | -fx-background-color: transparent; | | |
11. | -fx-border-color: white; | | |
12. | -fx-background-radius: 30; | | |
13. | -fx-border-radius: 30; | | |
14. | -fx-text-fill: white; | | |
15. | -fx-font-weight: bold; | | |
16. | -fx-font-size: 14px; | | |
17. | -fx-padding: 10 20 10 20; | | |
18. | Chart -fx-background-color: rgba(0,168,355,0.05); | | |
19. | Chart -fx-border-color: rgba(0,16,35,0.5) rgba(0,68,55,0.6) transparent rgba(0,68,55,0.7); | | |
20. | Set css file to Scene | | |
21. | Use addAll() to attach several stylesheets. | | |
22. | Set Control Id and use it in css | | |
23. | -fx-fill: red; | | |