Using JavaFX UI Controls

Previous
Next

21 Titled Pane and Accordion

This chapter explains how to use a combination of the accordion and title panes in your JavaFX applications.

A titled pane is a panel with a title. It can be opened and closed, and it can encapsulate any Node such as UI controls or images, and groups of elements added to a layout container.

Titled panes can be grouped by using the accordion control, which enables you to create multiple panes and display them one at a time. Figure 21-1 shows an accordion control that combines three titled panes.

Figure 21-1 Accordion with Three Titled Panes

Description of Figure 21-1 follows
Description of "Figure 21-1 Accordion with Three Titled Panes"

Use the Accordion and TitledPane classes in the JavaFX SDK API to implement these controls in your applications.

Creating Titled Panes

To create a TitledPane control define a title and some content. You can do this by using the two-parameter constructor of the TitledPane class, or by applying the setText and setContent methods. Both ways are shown in Example 21-1.

Example 21-1 Declaring a TitledPane Object

//using a two-parameter constructor
TitledPane tp = new TitledPane("My Titled Pane", new Button("Button"));
//applying methods
TitledPane tp = new TitledPane();
tp.setText("My Titled Pane");
tp.setContent(new Button("Button"));

Compiling and running an application with either of the code fragments produces the control shown in Figure 21-2.

Figure 21-2 Titled Pane with a Button

Description of Figure 21-2 follows
Description of "Figure 21-2 Titled Pane with a Button"

The titled pane is resized to accommodate the preferred size of its content. You can add multi-line text and evaluate the result as shown in Figure 21-3.

Figure 21-3 Titled Pane with Some Text

Description of Figure 21-3 follows
Description of "Figure 21-3 Titled Pane with Some Text"

Do not explicitly set the minimal, maximum, or preferred height of a titled pane, as this may lead to unexpected behavior when the titled pane is opened or closed.

The code fragment shown in Example 21-2 adds several controls to the titled pane by putting them into the GridPane layout container.

Example 21-2 Titled Pane with the GridPane Layout Container

TitledPane gridTitlePane = new TitledPane();
GridPane grid = new GridPane();
grid.setVgap(4);
grid.setPadding(new Insets(5, 5, 5, 5));
grid.add(new Label("First Name: "), 0, 0);
grid.add(new TextField(), 1, 0);
grid.add(new Label("Last Name: "), 0, 1);
grid.add(new TextField(), 1, 1);
grid.add(new Label("Email: "), 0, 2);
grid.add(new TextField(), 1, 2);        
gridTitlePane.setText("Grid");
gridTitlePane.setContent(grid);

When you run and compile an application with this code fragment, the output shown in Figure 21-4 appears.

Figure 21-4 Titled Pane that Contains Several Controls

Description of Figure 21-4 follows
Description of "Figure 21-4 Titled Pane that Contains Several Controls"

You can define the way a titled pane opens and closes. By default, all titled panes are collapsible and their movements are animated. If your application prohibits closing a titled pane, use the setCollapsible method with the false value. You can also disable animated opening by applying the setAnimated method with the false value. The code fragment shown in Example 21-3 implements these tasks.

Example 21-3 Adjusting the Style of a Titled Pane

TitledPane tp = new TitledPane();
//prohibit closing
tp.setCollapsible(false);
//prohibit animating
tp.setAnimated(false);

Adding Titled Panes to an Accordion

In your applications, you can use titled panes as standalone elements, or you can combine them in a group by using the Accordion control. Do not explicitly set the minimal, maximum, or preferred height of an accordion, as this may lead to unexpected behavior when one of its titled pane is opened.

Adding several titled panes to an accordion is similar to adding toggle buttons to a toggle group: only one titled pane can be opened in an accordion at a time. Example 21-4 creates three titled panes and adds them to an accordion.

Example 21-4 Accordion and Three Titled Panes

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.TitledPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
 
public class TitledPaneSample extends Application {
    final String[] imageNames = new String[]{"Apples", "Flowers", "Leaves"};
    final Image[] images = new Image[imageNames.length];
    final ImageView[] pics = new ImageView[imageNames.length];
    final TitledPane[] tps = new TitledPane[imageNames.length];
           
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override public void start(Stage stage) {
        stage.setTitle("TitledPane");
        Scene scene = new Scene(new Group(), 80, 180);
        scene.setFill(Color.GHOSTWHITE);
                               
        final Accordion accordion = new Accordion ();        
        
        for (int i = 0; i < imageNames.length; i++) {           
            images[i] = new 
                Image(getClass().getResourceAsStream(imageNames[i] + ".jpg"));
            pics[i] = new ImageView(images[i]);
            tps[i] = new TitledPane(imageNames[i],pics[i]); 
        }   
        accordion.getPanes().addAll(tps);
        accordion.setExpandedPane(tps[0]);
 
        Group root = (Group)scene.getRoot();
        root.getChildren().add(accordion);
        stage.setScene(scene);
        stage.show();
    }
}

Three titled panes are created within the loop. Content for each titled pane is defined as an ImageView object. The titled panes are added to the accordion by using the getPanes and addAll methods. You can use the add method instead of the addAll method to add a single titled pane.

By default, all the titled panes are closed when the application starts. The setExpandedPane method in Example 21-4 specifies that the titled pane with the Apples picture will be opened when you run the sample, as shown in Figure 21-5.

Figure 21-5 Accordion with Three Titled Panes

Description of Figure 21-5 follows
Description of "Figure 21-5 Accordion with Three Titled Panes"

Processing Events for an Accordion with Titled Panes

You can use titled panes and accordions to present different data in your applications. Example 21-5 creates a standalone titled pane with the GridPane layout container and three titled panes combined by using the accordion. The standalone titled pane contains UI elements of an email client. The accordion enables the selection of an image to appear in the Attachment field of the Grid titled pane.

Example 21-5 Implementing ChangeListener for an Accordion

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
 
public class TitledPaneSample extends Application {
    final String[] imageNames = new String[]{"Apples", "Flowers", "Leaves"};
    final Image[] images = new Image[imageNames.length];
    final ImageView[] pics = new ImageView[imageNames.length];
    final TitledPane[] tps = new TitledPane[imageNames.length];
    final Label label = new Label("N/A");
       
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override public void start(Stage stage) {
        stage.setTitle("TitledPane");
        Scene scene = new Scene(new Group(), 800, 250);
        scene.setFill(Color.GHOSTWHITE);
        
        // --- GridPane container
        TitledPane gridTitlePane = new TitledPane();
        GridPane grid = new GridPane();
        grid.setVgap(4);
        grid.setPadding(new Insets(5, 5, 5, 5));
        grid.add(new Label("To: "), 0, 0);
        grid.add(new TextField(), 1, 0);
        grid.add(new Label("Cc: "), 0, 1);
        grid.add(new TextField(), 1, 1);
        grid.add(new Label("Subject: "), 0, 2);
        grid.add(new TextField(), 1, 2);        
        grid.add(new Label("Attachment: "), 0, 3);
        grid.add(label,1, 3);
        gridTitlePane.setText("Grid");
        gridTitlePane.setContent(grid);
        
        // --- Accordion
        final Accordion accordion = new Accordion ();                
        for (int i = 0; i < imageNames.length; i++) {
            images[i] = new 
                Image(getClass().getResourceAsStream(imageNames[i] + ".jpg"));
            pics[i] = new ImageView(images[i]);
            tps[i] = new TitledPane(imageNames[i],pics[i]); 
        }   
        accordion.getPanes().addAll(tps);        
        accordion.expandedPaneProperty().addListener(new 
            ChangeListener<TitledPane>() {
                public void changed(ObservableValue<? extends TitledPane> ov,
                    TitledPane old_val, TitledPane new_val) {
                        if (new_val != null) {
                            label.setText(accordion.getExpandedPane().getText() + 
                                ".jpg");
                        }
              }
        });
        
        HBox hbox = new HBox(10);
        hbox.setPadding(new Insets(20, 0, 0, 20));
        hbox.getChildren().setAll(gridTitlePane, accordion);
 
        Group root = (Group)scene.getRoot();
        root.getChildren().add(hbox);
        stage.setScene(scene);
        stage.show();
    }
}

When a user opens a titled pane in the accordion, the expandedPaneProperty of the accordion changes. The ChangeListener object is notified about this change, and the expanded titled pane in the accordion is used to construct a file name of the attachment. This file name is set as text of the corresponding Label object.

Figure 21-6 shows how the application looks after its start. The Attachment label contains "N/A," because none of the titled panes are selected.

Figure 21-6 Initial View of the TitledPaneSample Application

Description of Figure 21-6 follows
Description of "Figure 21-6 Initial View of the TitledPaneSample Application"

If you expand the Leaves titled pane, the Attachment label will contain "Leaves.jpg," as shown in Figure 21-7.

Figure 21-7 TitledPaneSample Application with the Leaves Titled Pane Expanded

Description of Figure 21-7 follows
Description of "Figure 21-7 TitledPaneSample Application with the Leaves Titled Pane Expanded"

Because the TitledPane and Accordion classes are both extensions of the Node class, you can apply visual effects or transformations to them. You can also change the appearance of the controls by applying CSS styles.

Related API Documentation 

Previous
Next