# Lecture for November 13

## File IO (Cont.)

Last class we talked about reading from files, we can also write to files.

### Import necessary libraries

First you must import all of the necessary libraries

    // To read
    import java.util.Scanner;
    import java.io.FileOutputStream;
    // To Write
    import java.io.FileReader;
    import java.io.PrintWriter;
    // For Exception Handling
    import java.io.IOException;

Then in your main, declare a `FileOutputStream` and `PrintWriter`

    FileOutputStream file;
    PrintWriter print;

### Try-Catch-Finally

Create a try block to open a file for writing

    try {
          // If the file doesn't exist, it'll create it
          file = new FileOutputStream("output.txt");
          print = new PrintWriter(file);
    } catch (IOException except) {
          // Prints out the error message
          System.out.println("File error " + except.getMessage());
    }

Adding a finally block allows the program to clean up before it closes

        try {
          file = new FileOutputStream("output.txt");
          print = new PrintWriter(file);
        } catch (IOException except) {
          System.out.println("File error " + except.getMessage());
        } finally { // It starts here!
          delete file;
          delete print;
          file.close();
          return;
        }

### Write to the file :)

Then you can write the to file!

    // Do you notice the following methods?
      print.println("Your number is");
      print.print("My name is..\n");
      print.printf("%s %d", "Hello ", 5);
      print.flush(); //Clears the output stream
      file.close(); //Closes the file

Extra Note: Disk fragmentation is a way of cleaning up memory that isn't being used by any of the code on your computer.

## Swing Graphics

### Importing Necessary Libraries

You need to import all the necessary libraries first

    import javax.swing.*;
    import java.awt.FlowLayout;
    import java.awt.event.ActionListener;

### Changing the class header

Your class file needs to extend `JFrame` that way it can use a bunch of the already existent code written for Swing applications

    public class firstGUi extends JFrame {
      //....

### Swing Components

Java Swing makes use of what is called Swing Components. These are basic building blocks of GUI items you can add to the screen. For example, a checkbox, a radio button, text field. These are all swing components.

I wrote a blog post back in the summer which is an overview of them. You can check it out here: https://brandonrozek.com/2017/06/java-swing-components/

Inside your `firstGUI` class, declare some Swing components you would like to use in the program

    public class firstGUI extends JFrame {
      JButton button1;
      JTextArea area;
      JTextField text;
      // ....

### Constructor

You need to create a constructor for this class that way you can initiate all of the swing component values.

    // ...
    JButton button1;
    JTextArea area;
    JTextField text;

    // Begin Constructor
    firstGUI() {
      // Define the components
      JLabel name = new JLabel("Enter in your name:");
      text = new JTextField("Jennifer", 20); // 20 characters long, default value: Jennifer
      area = new JTextArea(10, 10); //Width and Height is 10 characters big
      JScrollPane sp = new JScrollPane(area); //Adds a scroll bar for the text area
      button1 = new JButton("Press Me");

      // Set the Layout
      // FlowLayout organizes each of the components top to bottom, left to right
      setLayout(new FlowLayout());

      // Add the components to the screen
      add(name);
      add(text);
      add(sp); // never add the textarea when surrounded by a ScrollPane
      add(button1);
    }

### New Main Method

Finally, you need to create the Main method which will initiate it all

    public static void main(String[] args) {
      firstGUI myFrame = new firstGUI();

      // End the program when the 'x' button (not keyboard) is pressed
      myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      myFrame.setTitle("My title"); // Titles the window
      myFrame.pack(); // Packs it all into the frame
      myFrame.setVisible(true); // Makes the frame appear on the screen
    }

### Making it interactive

You need to change your class header to the following

    public class firstGUI extends JFrame implements ActionListener {
      // ...

Then in your class, add the following method

    @Override public void actionPerformed(ActionEvent event) {
      // Do stuff as a result of an event here
      area.append("You Pressed the Button");
    }

To make it actually activate as a result of an event. You need to attach it to a swing component.

For example, I want the code in `actionPerformed` to activate in result of a button press.

Add the following line to your code in the constructor.

    //...
    button1 = new JButton("Press Me");
    button1.addActionListener(this); // New Code
    //....

### Identifying Button Pressed

How do you know which button was pressed in the `actionPerformed` method?

You can use `event.getSource()` to find out.

Example:

    @Override public void actionPerformed(ActionEvent event) {
      if (event.getSource() == button1) { // Replace button1 with appropriate variable name
        // Do things as a result of a specific button being pressed
      }
    }

### Summary

To use Swing, do the following steps

1. Import Libraries
2. Declare J___ variables
3. New the J___ variables
4. Add the J___ variables to the frame
5. Add the `ActionListener` to the components you wish to monitor