Untitled
unknown
plain_text
3 years ago
11 kB
8
Indexable
package cs1302.gallery;
import javafx.animation.Animation.Status;
import javafx.animation.Animation;
import javafx.scene.image.ImageView;
import javafx.scene.image.Image;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Alert;
import java.util.Arrays;
import javafx.util.Duration;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import com.google.gson.*;
import java.net.MalformedURLException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.layout.Priority;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import javafx.scene.control.Label;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.TilePane;
import javafx.scene.control.ProgressBar;
import java.lang.Thread;
import java.lang.Runnable;
import javafx.scene.control.Separator;
import javafx.geometry.Orientation;
import java.net.URLEncoder;
import java.net.URL;
import java.io.InputStreamReader;
import javafx.application.Platform;
import java.util.Random;
/**
* Represents an iTunes GalleryApp.
*/
public class GalleryApp extends Application {
VBox vBox;
VBox aboutMe;
ToolBar pane;
ToolBar toolBarBox;
MenuBar menuBar;
Menu fileMenu;
Menu helpMenu;
MenuItem aboutMeMenu;
MenuItem exitMenu;
Button pauseButton;
Separator separator;
Button updateButton;
TextField urlField;
TilePane tilePane;
ImageLoader[] imageLoaders;
String[] extras;
ProgressBar progressBar;
Timeline timeline;
String neededUrl;
double percent;
Alert errorAlert;
/**
* The itunes url at the front.
*/
private final String itunesFront =
"https://itunes.apple.com/search?term=";
/**
* The itunes url at the end.
*/
private final String itunesBack =
"&limit=50&media=music";
/**
* Start method.
*/
@Override
public void start(Stage stage) {
vBox = new VBox(8);
menuBar();
toolBar();
defaultImagePane();
progressBar();
updateImageButton();
generateRandomImage();
updateImage(urlField.getText());
timeline.pause();
pauseImage();
Scene scene = new Scene(vBox);
stage.setMaxWidth(1280);
stage.setMaxHeight(720);
stage.setTitle("GalleryApp!");
stage.setScene(scene);
stage.sizeToScene();
stage.show();
} // start
/**
* Creates a menuBar item.
*/
public void menuBar() {
//pane = new ToolBar();
menuBar = new MenuBar();
fileMenu = new Menu("File");
helpMenu = new Menu("Help");
aboutMeMenu = new MenuItem("About");
EventHandler<ActionEvent> aboutMeEvent = event -> {
Alert aboutAlert = new Alert(AlertType.INFORMATION);
aboutAlert.setResizable(true);
aboutAlert.setTitle("About Luan Ho");
aboutAlert.setHeaderText(null);
Image luanImage = new Image("file:resources/luanPicture.jpg", 450, 450, false, false);
ImageView luanView = new ImageView(luanImage);
luanView.setFitHeight(450);
luanView.setFitHeight(450);
aboutAlert.setGraphic(luanView);
aboutAlert.setContentText("Luan Ho\nlqh24430@uga.edu\nVersion 10.1");
aboutAlert.showAndWait();
};
aboutMeMenu.setOnAction(aboutMeEvent);
exitMenu = new MenuItem("Exit");
EventHandler<ActionEvent> exit = event -> {
Runnable instructions = () -> {
System.exit(0);
};
runNow(instructions);
};
exitMenu.setOnAction(exit);
fileMenu.getItems().add(exitMenu);
helpMenu.getItems().add(aboutMeMenu);
menuBar.getMenus().addAll(fileMenu, helpMenu);
vBox.getChildren().add(menuBar);
} // menuBar
/**
* Creates the toolBar item.
*/
public void toolBar() {
toolBarBox = new ToolBar();
pauseButton = new Button("Play");
separator = new Separator(Orientation.VERTICAL);
Label searchQuery = new Label("Search Query: ");
urlField = new TextField("jack johnson");
updateButton = new Button("Update Images");
toolBarBox.getItems().addAll(pauseButton, separator, searchQuery, urlField, updateButton);
vBox.getChildren().add(toolBarBox);
} // toolBar
/**
* Sets images.
*
* @param url the url of the search
* @param index the position
*/
public void setImages(String url, int index) {
imageLoaders[index].loadImage(url);
}
/**
* This gives functioanlity to the update button.
*/
public void updateImageButton() {
EventHandler<ActionEvent> update = e -> {
Runnable instructions = () -> {
neededUrl = urlField.getText();
timeline.pause();
updateImage(neededUrl);
};
runNow(instructions);
};
updateButton.setOnAction(update);
}
/**
* Update the images in the search query.
* Used in toolBar.
*
* @param s the string url.
*/
public void updateImage(String s) {
try {
updateButton.setDisable(true);
String sURL = URLEncoder.encode(s.toLowerCase(), "UTF-8");
String itunesURL = itunesFront + sURL + itunesBack;
URL url = new URL(itunesURL);
InputStreamReader reader = new InputStreamReader(url.openStream());
JsonElement je = JsonParser.parseReader(reader);
JsonObject root = je.getAsJsonObject();
JsonArray results = root.getAsJsonArray("results");
int numResults = results.size();
Platform.runLater(() -> progressBar.setProgress(0));
if (numResults > 20) {
extras = new String[numResults - 20];
for (int i = 0; i < 20; i++) {
JsonObject result = results.get(i).getAsJsonObject();
JsonElement artworkUrl100 = result.get("artworkUrl100");
if (artworkUrl100 != null) {
setImages(artworkUrl100.getAsString(), i);
loadProgress(i);
}
}
Platform.runLater(() -> progressBar.setProgress(1));
for (int i = 20; i < numResults; i++) {
JsonObject result = results.get(i).getAsJsonObject();
JsonElement artworkUrl100 = result.get("artworkUrl100");
if (artworkUrl100 != null) {
extras[i - 20] = artworkUrl100.getAsString();
}
}
} else {
Runnable alert = () -> {
errorAlert = new Alert(AlertType.ERROR);
errorAlert.setResizable(true);
errorAlert.setTitle("Error!");
errorAlert.setHeaderText("Cannot find more than 21 images for this search.");
errorAlert.setContentText("Try another search.");
errorAlert.showAndWait();
Platform.runLater( () -> progressBar.setProgress(1));
};
Platform.runLater(alert);
} //else
} catch (UnsupportedEncodingException z) {
System.out.println("The URL cannot be encoded");
} catch (MalformedURLException mue) {
System.out.println("The URL is malformed");
} catch (IOException ioe) {
System.out.println("IOException");
} finally {
timeline.play();
Platform.runLater(() -> pauseButton.setText("Pause"));
updateButton.setDisable(false);
}
}
/**
* This progresses the progress bar.
* @param index the index.
*/
public void loadProgress(final double index) {
Runnable z = () -> {
percent = (index / 20.0);
progressBar.setProgress(percent);
};
Platform.runLater(z);
}
/**
* Generate random images.
*/
public void generateRandomImage() {
EventHandler<ActionEvent> handler = event -> {
Random random = new Random();
imageLoaders[random.nextInt(20)].loadImage(extras[random.nextInt(extras.length)]);
};
KeyFrame keyFrame = new KeyFrame(new Duration(2000.0), handler);
timeline = new Timeline(keyFrame);
this.timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}
/**
* Pauses the images.
*/
public void pauseImage() {
EventHandler<ActionEvent> pausePlay = event -> {
Runnable instructions = () -> {
if (pauseButton.getText().equals("Pause")) {
Platform.runLater(() -> pauseButton.setText("Play"));
timeline.pause();
} else {
Platform.runLater(() -> pauseButton.setText("Pause"));
timeline.play();
}
}; //Runnable
runNow(instructions);
}; //pausePlay
pauseButton.setOnAction(pausePlay);
}
/**
* Creates the image pane.
*/
public void defaultImagePane() {
tilePane = new TilePane();
tilePane.setPrefColumns(5);
tilePane.setPrefRows(4);
imageLoaders = new ImageLoader[20];
for (int i = 0; i < imageLoaders.length; i++) {
imageLoaders[i] = new ImageLoader();
tilePane.getChildren().add(imageLoaders[i]);
}
vBox.getChildren().add(tilePane);
//updateImage(urlField.getText());
}
/**
* Creates a progress bar.
*/
public void progressBar() {
progressBar = new ProgressBar();
progressBar.setProgress(1.00);
vBox.getChildren().add(progressBar);
}
/**
* Runs an action on a new thread.
* From previous exercise.
* @param target the action to run
*/
public static void runNow(Runnable target) {
Thread t = new Thread(target);
t.setDaemon(true);
t.start();
}
} // GalleryAppEditor is loading...