Java Null Pointer При нажатии JButton(Eclipse)

Вот мой код Я пытаюсь создать простой текстовый редактор, чтобы попробовать писать и читать файлы вместе с JPanels и тому подобным. Моя текущая проблема заключается в том, что пользователи должны вводить полный путь к файлу файла, и это может сильно расстраивать. Поэтому я сделал кнопку, которая позволяет пользователю задавать настройки пути к файлу. Когда вы нажимаете кнопку "File Path Settings", появляется всплывающее окно, позволяющее вам установить настройки. (Кнопка просмотра файлов будет реализована позже, я просто хотел сделать это сначала ради интереса.)

public class EventListeners {

    String textAreaValue;
    String filePath;
    String rememberedPath;
    String rememberedPathDirectory;
    //Global components
    JTextField fileName,saveFilePath,filePathSaveDirectory,savedFilePath;
    JButton save,help,savePath;
    //JTextArea text;

    public EventListeners(){
        window();
    }

    public void window(){
        JFrame window = new JFrame();
        window.setVisible(true);
        window.setSize(650,500); 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        JButton saveFilePath = new JButton("File Path Save Settings");
        JTextArea ltext = new JTextArea(10,50);
        JLabel filler = new JLabel("                                ");
        JLabel lfileName = new JLabel("File Path(If error click help)");
        JLabel lsaveFilePath = new JLabel("Save Path");
        fileName = new JTextField(30);
        save = new JButton("Save File");
        help = new JButton("Help");

        panel.add(lfileName);
        panel.add(fileName);
        panel.add(save);
        panel.add(help);
        panel.add(ltext);
        panel.add(filler);
        window.add(panel);

        saveFilePath.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e){
                //JOptionPane.showMessageDialog(null,"Hello world!");

                JFrame windowB = new JFrame();
                int windows = 2;
                windowB.setVisible(true);
                windowB.setSize(500,500); 
                windowB.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel panelB = new JPanel();
                JLabel lFilePathSaveDirectory = new JLabel("Directory where the file path settings will be stored");
                filePathSaveDirectory = new JTextField(20);
                JLabel lsavedFilePath = new JLabel("The full file path or part you want stored.");
                savedFilePath = new JTextField(20);
                savePath = new JButton("Save Settings");
                panelB.add(lFilePathSaveDirectory);
                panelB.add(filePathSaveDirectory);
                panelB.add(lsavedFilePath);
                panelB.add(savedFilePath);
                panelB.add(savePath);
                windowB.add(panelB);
            }
        });
        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textAreaValue = ltext.getText();
                filePath = fileName.getText();
                try {
                    FileWriter fw = new FileWriter(filePath);
                    PrintWriter pw = new PrintWriter(fw);

                    pw.println(textAreaValue);
                    pw.close();
                    JOptionPane.showMessageDialog(panel, "File Written!","Success!",JOptionPane.PLAIN_MESSAGE);
                } catch(IOException x) {
                    JOptionPane.showMessageDialog(panel, "Error in writing file. \n\n Try Checking the file path or making sure the directory in which you are saving the file exists. \n\n Keep Calm and Love Beavers","Error",JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        help.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(panel, "       ***The file name must be the full file path.***\n\n-=-=-=-=-=-=-=-=-=(MAC)=-=-=-=-=-=-=-=-=-\n\n Example: /Users/Cheese/Documents/FileName.txt\n\n\n-=-=-=-=-=-=-=-=(WINDOWS)=-=-=-=-=-=-=-=-\n\n *Note that 2 back slashes must be used* \n\nC:\\user\\docs\\example.txt", "Help",JOptionPane.PLAIN_MESSAGE);
            }
        });

        panel.add(saveFilePath);
        window.add(panel);
        saveFilePath.setSize(20,100); 

        savePath.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rememberedPathDirectory = filePathSaveDirectory.getText();
                rememberedPath = savedFilePath.getText();
                try {
                    FileWriter fw = new FileWriter(rememberedPathDirectory+"filePathSettings.txt");
                    PrintWriter pw = new PrintWriter(fw);

                    pw.println(rememberedPath);
                    pw.close();
                    JOptionPane.showMessageDialog(panel, "File Written!","Success!",JOptionPane.PLAIN_MESSAGE);
                } catch(IOException x) {
                    JOptionPane.showMessageDialog(panel, "Error in writing file. \n\n Try Checking the file path or making sure the directory in which you are saving the file exists. \n\n Keep Calm and Love Beavers","Error",JOptionPane.ERROR_MESSAGE);
                }
                JOptionPane.showMessageDialog(panel, "The application will close. Anythings not saved will be deleted", "Alert",JOptionPane.WARNING_MESSAGE);
            }
        });
    }

    public static void main(String[] args) {
        new EventListeners();  
    }   
}

2 ответа

Основная проблема в том, что вы создаете переменную с тем же именем внутри конструктора, вы уже определили ее как экземпляр. Затем переменная вашего экземпляра оставьте неинициализированной / пустой.

например, вы объявите переменную экземпляра

JButton save, help, savePath, saveFilePath;

внутри конструктора вы создаете еще один локальный jbutton и инициализируете его, чтобы переменная экземпляра была нулевой. поэтому вместо создания нового вам следует инициализировать поле экземпляра.

JButton saveFilePath = new JButton("File Path Save Settings"); // problem

saveFilePath = new JButton("File Path Save Settings"); // correct way

но есть другая проблема.. вы должны объявить saveFilePath поле экземпляра как поле jtext, и вы создали кнопку saveFilePath внутри конструктора. Я думаю, что это может быть кнопка, а не текстовое поле.

также вы инициализируете некоторые переменные внутри saveFilePath.addActionListener(new ActionListener() { метод, но вы добавляете actionlistners им раньше saveFilePath действие запущено. нужно добавить actionlistners после того, как вы инициализировали компонент.

также вы должны позвонить repaint() наконец, после добавления всех компонентов в кадр.

попробуйте запустить этот код

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

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

public class EventListeners {

    String textAreaValue;
    String filePath;
    String rememberedPath;
    String rememberedPathDirectory;
    //Global components
    JTextField fileName, filePathSaveDirectory, savedFilePath;
    JButton save, help, savePath, saveFilePath;
    //JTextArea text;

    public EventListeners() {
        window();
    }

    public void window() {

        JFrame window = new JFrame();

        window.setSize(650, 500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        saveFilePath = new JButton("File Path Save Settings");
        JTextArea ltext = new JTextArea(10, 50);
        JLabel filler = new JLabel("                                ");
        JLabel lfileName = new JLabel("File Path(If error click help)");
        JLabel lsaveFilePath = new JLabel("Save Path");
        fileName = new JTextField(30);
        save = new JButton("Save File");
        help = new JButton("Help");

        panel.add(lfileName);
        panel.add(fileName);
        panel.add(save);
        panel.add(help);
        panel.add(ltext);
        panel.add(filler);
        window.add(panel);

        saveFilePath.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null,"Hello world!");

                JFrame windowB = new JFrame();
                int windows = 2;
                windowB.setVisible(true);
                windowB.setSize(500, 500);
                windowB.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel panelB = new JPanel();
                JLabel lFilePathSaveDirectory = new JLabel("Directory where the file path settings will be stored");
                filePathSaveDirectory = new JTextField(20);
                JLabel lsavedFilePath = new JLabel("The full file path or part you want stored.");
                savedFilePath = new JTextField(20);
                savePath = new JButton("Save Settings");
                panelB.add(lFilePathSaveDirectory);
                panelB.add(filePathSaveDirectory);
                panelB.add(lsavedFilePath);
                panelB.add(savedFilePath);
                panelB.add(savePath);
                windowB.add(panelB);
                System.out.println(savePath);
                savePath.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        rememberedPathDirectory = filePathSaveDirectory.getText();
                        rememberedPath = savedFilePath.getText();
                        try {
                            FileWriter fw = new FileWriter(rememberedPathDirectory + "filePathSettings.txt");
                            PrintWriter pw = new PrintWriter(fw);

                            pw.println(rememberedPath);
                            pw.close();
                            JOptionPane.showMessageDialog(panel, "File Written!", "Success!", JOptionPane.PLAIN_MESSAGE);
                        } catch (IOException x) {
                            JOptionPane.showMessageDialog(panel, "Error in writing file. \n\n Try Checking the file path or making sure the directory in which you are saving the file exists. \n\n Keep Calm and Love Beavers", "Error", JOptionPane.ERROR_MESSAGE);
                        }
                        JOptionPane.showMessageDialog(panel, "The application will close. Anythings not saved will be deleted", "Alert", JOptionPane.WARNING_MESSAGE);
                    }
                });

            }

        });
        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textAreaValue = ltext.getText();
                filePath = fileName.getText();
                try {
                    FileWriter fw = new FileWriter(filePath);
                    PrintWriter pw = new PrintWriter(fw);

                    pw.println(textAreaValue);
                    pw.close();
                    JOptionPane.showMessageDialog(panel, "File Written!", "Success!", JOptionPane.PLAIN_MESSAGE);
                } catch (IOException x) {
                    JOptionPane.showMessageDialog(panel, "Error in writing file. \n\n Try Checking the file path or making sure the directory in which you are saving the file exists. \n\n Keep Calm and Love Beavers", "Error", JOptionPane.ERROR_MESSAGE);
                }

            }
        });
        help.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(panel, "       ***The file name must be the full file path.***\n\n-=-=-=-=-=-=-=-=-=(MAC)=-=-=-=-=-=-=-=-=-\n\n Example: /Users/Cheese/Documents/FileName.txt\n\n\n-=-=-=-=-=-=-=-=(WINDOWS)=-=-=-=-=-=-=-=-\n\n *Note that 2 back slashes must be used* \n\nC:\\user\\docs\\example.txt", "Help", JOptionPane.PLAIN_MESSAGE);
            }
        });

        panel.add(saveFilePath);
        window.add(panel);
        saveFilePath.setSize(20, 100);
        window.setVisible(true);
    }

    public static void main(String[] args) {

        new EventListeners();

    }

}

Вы также можете рассмотреть возможность внедрения зависимости. Это становится стандартным способом ведения дел в отрасли. Вместо того, чтобы конструктор выполнял всю работу по созданию всех объектов, используемых вашим классом, или вызывал другой метод, такой как window(), чтобы выполнить всю работу, вы передаете все спецификации конструктору. Это может выглядеть примерно так

public EventListeners(JButton save, JButton help, JButton saveFilePath) {
    this.save = save;
    this.help = help;
    this.saveFilePath = saveFilePath);
}

Конечно, вы также можете использовать среду внедрения зависимостей, такую ​​как Spring, но это может быть немного, если ваше приложение маленькое.

Другие вопросы по тегам