Wednesday 4 January 2017

Chapter 16 Exercise 27, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

16.27 (Display country flag and flag description)
Listing 16.4, ComboBoxDemo.java, gives a program that
lets the user view a country’s flag image and description
by selecting the country from a combo box.
The description is a string coded in the program.
Rewrite the program to read the text description from a file.
Suppose that the descriptions are stored in the files description0.txt, . . . , and
description8.txt under the text directory for the nine countries Canada,
China, Denmark, France, Germany, India, Norway, United Kingdom,
and United States, in this order.

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Exercise_27 extends Application {

    // Declare an array of Strings for flag titles
    private String[] flagTitles = {"Canada", "China", "Denmark",
            "France", "Germany", "India", "Norway", "United Kingdom",
            "United States of America"};

    // Declare an ImageView array for the national flags of 9 countries
    private ImageView[] flagImage = {new ImageView("image/ca.gif"),
            new ImageView("image/china.gif"),
            new ImageView("image/denmark.gif"),
            new ImageView("image/fr.gif"),
            new ImageView("image/germany.gif"),
            new ImageView("image/india.gif"),
            new ImageView("image/norway.gif"),
            new ImageView("image/uk.gif"), new ImageView("image/us.gif")};

    // Declare an array of strings for flag descriptions
    private String[] flagDescription = new String[9];

    // Declare and create a description pane
    private DescriptionPane descriptionPane = new DescriptionPane();

    // Create a combo box for selecting countries
    private ComboBox<String> cbo = new ComboBox<>(); // flagTitles);

    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        // Set text description

        for (int i = 0; i < flagDescription.length; i++) {
            Scanner input;
            String s = "";

            try {
                input = new Scanner(new File("src/Text Files/description" + i + ".txt"));

                while (input.hasNext()) {
                    s += input.nextLine() + "\n";
                }
                flagDescription[i] = s;

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

        }
        // Set the first country (Canada) for display
        setDisplay(0);

        // Add combo box and description pane to the border pane
        BorderPane pane = new BorderPane();

        BorderPane paneForComboBox = new BorderPane();
        paneForComboBox.setLeft(new Label("Select a country: "));
        paneForComboBox.setCenter(cbo);
        pane.setTop(paneForComboBox);
        cbo.setPrefWidth(400);
        cbo.setValue("Canada");

        ObservableList<String> items =
                FXCollections.observableArrayList(flagTitles);
        cbo.getItems().addAll(items);
        pane.setCenter(descriptionPane);

        // Display the selected country
        cbo.setOnAction(e -> setDisplay(items.indexOf(cbo.getValue())));

        // Create a scene and place it in the stage
        Scene scene = new Scene(pane, 450, 170);
        primaryStage.setTitle("ComboBoxDemo"); // Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage
    }

    /** Set display information on the description pane */
    public void setDisplay(int index) {
        descriptionPane.setTitle(flagTitles[index]);
        descriptionPane.setImageView(flagImage[index]);
        descriptionPane.setDescription(flagDescription[index]);
    }

    /**
     * The main method is only needed for the IDE with limited
     * JavaFX support. Not needed for running from the command line.
     */
    public static void main(String[] args) {
        launch(args);
    }

    private class DescriptionPane extends BorderPane {
        /** Label for displaying an image and a title */
        private Label lblImageTitle = new Label();

        /** Text area for displaying text */
        private TextArea taDescription = new TextArea();

        public DescriptionPane() {
            // Center the icon and text and place the text under the icon
            lblImageTitle.setContentDisplay(ContentDisplay.TOP);
            lblImageTitle.setPrefSize(200,  100);

            // Set the font in the lbl and the text field
            lblImageTitle.setFont(new Font("SansSerif", 16));
            taDescription.setFont(new Font("Serif", 14));

            taDescription.setWrapText(true);
            taDescription.setEditable(false);

            // Create a scroll pane to hold the text area
            ScrollPane scrollPane = new ScrollPane(taDescription);

            // Place lbl and scroll pane in the border pane
            setLeft(lblImageTitle);
            setCenter(scrollPane);
            setPadding(new Insets(5, 5, 5, 5));
        }

        /** Set the title */
        public void setTitle(String title) {
            lblImageTitle.setText(title);
        }

        /** Set the image view */
        public void setImageView(ImageView icon) {
            lblImageTitle.setGraphic(icon);
        }

        /** Set the text description */
        public void setDescription(String text) {
            taDescription.setText(text);
        }
    }
}

No comments :

Post a Comment