#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 уже объявлены, нет необходимости объявлять их при инициализации.