I decided on making a small notepad editor in Java using Swing and I think it functions pretty well. Unfortunately, my skills in making my project tidy and organized has abandoned me; it looks like spaghetti code, which many renowned programmers discourage from doing.

What can I do to make my code simpler?

Note: The `JFontChooser.java` does not belong to me. The entire file belongs to ZoeloeSoft.

[Project](https://www.tusfiles.net/t1m4pwu23ebd)

FramePanel.java - Adds all editable JTextArea

	// events and actions
	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.JCheckBoxMenuItem;
	import java.io.File;
	
	// for gui-related
	import javax.swing.*;
	
	// for opening/saving files
	import javax.swing.filechooser.*;
	
	public class FramePanel implements ActionListener
	{
	    private Frame window;
	    private JPanel panel;
	    private JTextArea edit;
	    private File openFile;
	    private JScrollPane scroll;
	    private JFileChooser dialog;
	    private Utilities util;
	
	    // instantiate the panel
	    public FramePanel(Frame caller)
	    {
	        // instantiate the utilites class and filechooser for function
	        util = new Utilities();
	        dialog = new JFileChooser();
	        openFile = null;
	
	        // instantiate the panel with borderlayout and frame
	        panel = new JPanel();
	        window = caller;
	        panel.setLayout(new BorderLayout());
	
	        // instantiate the scrollpanel and editarea
	        edit = new JTextArea();
	        scroll = new JScrollPane(edit);
	
	        // customize editarea
	        edit.setFont(new Font("Courier New", Font.PLAIN, 12));
	        edit.setTabSize(4);
	
	        // add the scrollpane with editarea in the panel
	        panel.add(scroll, BorderLayout.CENTER);
	    }
	
	    // pass on panel to frame
	    public JPanel getPanel() { return panel; }
	
	    // listen for actions/clicks
	    public void actionPerformed(ActionEvent e)
	    {
	        String query = e.getActionCommand();
	
	        // if new was clicked > erase document to null
	        if (query.equals("New")) {
	            edit.setText(null);
	            window.setName(null);
	            openFile = null;
	        }
	            
	        // if open was clicked > open new file
	        else if (query.equals("Open"))
	        {
	            int result = dialog.showOpenDialog(dialog);
	
	            if (result == JFileChooser.APPROVE_OPTION) {
	                String fileName = util.openFile(edit, dialog.getSelectedFile());
	                openFile = dialog.getSelectedFile();
	                
	                window.setName(fileName);
	            }
	        }
	        // if save was clicked > save if new file; overwrite if existing
	        else if (query.equals("Save"))
	        {
	            if (openFile != null && openFile.exists())
	                util.saveFile(edit, openFile, true);
	            else
	            {
	                int ret = dialog.showSaveDialog(dialog);
	                
	                if (ret == JFileChooser.APPROVE_OPTION) {
	                    String name = util.saveFile(edit, dialog.getSelectedFile(), false);
	                    openFile = dialog.getSelectedFile();
	                }
	                
	                window.setName(openFile.getName());
	            }
	        }
	        // if exit was clicked > exit
	        else if (query.equals("Exit"))
	            window.exit();
	        // if select all was clicked > select all text
	        else if (query.equals("Select All"))
	            edit.selectAll();
	        // if time/date was clicked > append time and date.
	        else if (query.equals("Time/Date"))
	            edit.append(util.getDate());
	        // if word wrap was selected > set editable to word wrap t/f
	        else if (query.equals("Word Wrap"))
	        {
	            JCheckBoxMenuItem opt = (JCheckBoxMenuItem)e.getSource();
	            edit.setLineWrap(opt.isSelected());
	        }
	        // if font was selected > set editable.font to selected font
	        else if (query.equals("Font"))
	            util.changeFont(edit);
	    }
	}

Utilities - Adds functionality to `FramePanel.java`

	// for editable
	import javax.swing.JTextArea;
	import java.awt.Font;
	
	// for opening a file
	import java.io.File;
	import java.io.FileReader;
	import java.util.Scanner;
	import javax.swing.JCheckBoxMenuItem;
	
	// for writing a file
	import java.io.BufferedWriter;
	import java.io.FileWriter;
	import java.io.IOException;
	
	// for appending dates
	import java.util.Date;
	import java.text.DateFormat;
	import java.text.SimpleDateFormat;
	
	public class Utilities
	{
		// open file; should only be called from framepanel and requires
		// jfilechooser and editable
		public String openFile(JTextArea editable, File file)
		{
			editable.setText(null);
	
			// instantiate the scanner and make string pointing to filepath
			Scanner fileReader = null;
			String filePath = file.getPath();
	
			// try to open file
			try
			{
				fileReader = new Scanner(new FileReader(filePath));
	
				// loop until all files are appended to editable
				while (fileReader.hasNextLine())
					editable.append(fileReader.nextLine() + "\n");
			}
			// catch any errors and exceptions
			catch (Exception except) {
				except.printStackTrace();
			}
			// close the reader
			finally {
				fileReader.close();
			}
	
			return file.getName();
		}
	
		// save file; should only be called from framepanel and requires
		// jfilechooser and editable
		public String saveFile(JTextArea editable, File file, boolean overWrite)
		{
			String fileName = file.getName();
			String text = editable.getText();
			BufferedWriter writer = null;
			
			if (overWrite)
			{
				try
				{
					writer = new BufferedWriter(new FileWriter(file.getAbsolutePath()));
					writer.write(""); // to clear out text
					writer.append(text);
				}
				catch (Exception e) { e.printStackTrace(); }
				finally
				{
					try
					{
						writer.flush();
						writer.close();
					}
					catch (Exception e) { e.printStackTrace(); }
				}
				
				fileName += "0";
			}
			else
			{
				try
				{
					writer = new BufferedWriter(new FileWriter(file.getAbsolutePath()));
					writer.write(text);
				}
				catch (Exception e) { e.printStackTrace(); }
				finally
				{
					try
					{
						writer.flush();
						writer.close();
					}
					catch (Exception e) { e.printStackTrace(); }
				}
				
				fileName += "1";
			}
			
			return fileName;
		}
	
		// gives date to caller
		public String getDate()
		{
			DateFormat dateList = new SimpleDateFormat("hh:mm MM/dd/yyyy");
			Date date = new Date();
			return dateList.format(date);
		}
	
		// changes font of Jtextarea
		public void changeFont(JTextArea editable)
		{
			Font current = editable.getFont();
			JFontChooser dialog = new JFontChooser(null);
			dialog.setFont(current);
			int ret = dialog.showDialog();
	
			if (ret == dialog.OK_OPTION)
				editable.setFont(dialog.getFont());
		}
	}