Не удается вызвать «javax.swing.JFrame.setVisible(логическое значение)», потому что «this.SecondFrame» равно нулю

#java #actionlistener

Вопрос:

Я действительно не понимаю этой ошибки. что это значит и как я могу это исправить?

 package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public class MyClass implements ActionListener
{
JFrame firstFrame;
JFrame secondFrame;
JButton firstButton;

public MyClass()
{
    firstButton = new JButton("Convert Currencies");
    firstButton.setBounds(150, 100, 200, 50);
    firstButton.setText("Convert Currencies");
    firstButton.setFocusable(false);
    firstButton.setVisible(true);
    firstButton.setLayout(null);
    firstButton.addActionListener(this);

    firstFrame = new JFrame("Currency Converter");
    firstFrame.getContentPane().setBackground(new Color(0xD3D3D3));
    firstFrame.setSize(500, 700);
    firstFrame.setLocation(870,15);
    firstFrame.setResizable(false);
    firstFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    firstFrame.setVisible(true);
    firstFrame.setLayout(null);
    firstFrame.add(firstButton);

    JFrame secondFrame = new JFrame("Currency Converter");
    secondFrame.getContentPane().setBackground(new Color(0xD3D3D3));
    secondFrame.setSize(500, 700);
    secondFrame.setLocation(870,15);
    secondFrame.setResizable(false);
    secondFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    secondFrame.setLayout(null);
    secondFrame.setVisible(false);
}
public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == firstButton)
    {
        firstFrame.setVisible(false);
        secondFrame.setVisible(true);
    }
}
}
 

Полная ошибка: Исключение в потоке «AWT-EventQueue-0» java.lang.Исключение NullPointerException: Не удается вызвать «javax.swing.JFrame.setVisible(логическое значение)», потому что «this.SecondFrame» равно нулю

Комментарии:

1. Вы объявили локальную переменную, вызываемую secondFrame в вашем конструкторе, и инициализировали ее вместо инициализации поля secondFrame .

2. Итак, где же линия, которую я должен изменить, и как я должен ее изменить? (я абсолютный новичок)

3.Что сказал @хелвуд. Взгляните на JFrame secondFrame = new JFrame("Currency Converter"); внутренний public MyClass() { .. } конструктор. Он объявляет локальную переменную с именем secondFrame , которая является отдельной переменной от JFrame secondFrame; поля вашего класса (даже если у нее такое же имя). Что вы хотите, так это присвоить значение существующей secondFrame , поэтому удалите JFrame JFrame secondFrame = new JFrame("Currency Converter"); ее, чтобы предотвратить объявление новой переменной.

4. @jakob Взгляните, как вы инициализировали firstFrame . Таким же образом вы должны следовать за secondFrame

Ответ №1:

Вам не нужно создавать другую переменную JFrame, если вы уже объявили второй кадр за пределами MyClass.

Просто удалите JFrame перед вторым кадром, так как вы уже объявили его ранее.

Правильный код:

secondFrame = new JFrame("Currency Converter");

Комментарии:

1. Хорошо, но разве я не сделал то же самое с другим первым кадром и кнопкой первой кнопки? Это работает с ними… ПРАВКА: Хорошо, я понял это сейчас! Спасибо!

2. Нет, для firstButton и firstFrame вы не добавили JFrame к ним, когда инициализировали его. Поскольку все 3 уже объявлены, нет необходимости объявлять их при инициализации.