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
- Import Libraries
- Declare J___ variables
- New the J___ variables
- Add the J___ variables to the frame
- Add the
ActionListener
to the components you wish to monitor