Как передать ссылку на основной класс в класс JFrame

Как мне передать ссылку на основной класс в мой класс JFrame? Я хочу использовать функцию внутри моего основного класса в моем классе JFrame и наоборот. Я хочу использовать функцию addOne() из моего основного класса внутри моего класса JFrame и функцию getNumber() из класса JFrame в моем основном классе.

Я попробовал приведенный ниже код и получил ошибку «Конструктор MyJFrame(new Runnable(){}) не определен», когда я пытаюсь передать ссылку на основной класс.

Код:

package main;

import javax.swing.SwingUtilities;

public class Main {
    
    public MyJFrame myJFrame;
    
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run()
            {
                this.myJFrame = new MyJFrame(this);
            }
        });
    }

    public int addOne(int amount)
    {
        //i want to use the method getNumber from the MyJFrame class here
        return amount + 1;
    }
    
}


package main;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class MyJFrame extends JFrame implements WindowListener {

    private static final long serialVersionUID = -2422522191234311369L;
    
    Main main;
    
    public MyJFrame(Main main)
    {
        super("MyJFrame");
        this.main = main;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true);
        setResizable(false);
        addWindowListener(this);
    }

    @Override
    public void windowActivated(WindowEvent e) {
        System.out.println("Window has been activated");
    }

    @Override
    public void windowClosed(WindowEvent e) {
        System.out.println("Window has been closed");
    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.out.println("About to close window");
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        System.out.println("Window has been deactivated");
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        System.out.println("Window has been restored"); 
    }

    @Override
    public void windowIconified(WindowEvent e) {
        System.out.println("Window has been minimized");
        
    }
    
    @Override
    public void windowOpened(WindowEvent e) {
        System.out.println("Window has been opened");
    }
    
    //i want to use this function inside my Main class
    public int getNumber() 
    {
        return 10;
    }
}

Я попытался создать экземпляр MyJFrame в классе Main и передать ссылку на основной класс в параметрах, но это не сработало.

public MyJFrame frame = new MyJFrame(this);

Итак, какой экземпляр Main вы хотите передать в качестве ссылки конструктору MyJFrame? (Подсказка: на данный момент я не вижу ни одного случая создания Main...) Кроме того, информации «это не сработало» никогда не бывает достаточно — всегда показывайте точную ошибку (или какое-то нежелательное поведение) и объясняйте как вы пытались это исправить или что вы в этом не понимаете.

Jon Skeet 06.10.2023 14:58

подсказка: узнайте разницу между статическими и нестатическими методами.

Peter Bruins 06.10.2023 15:05

Я обновил код до того, что пробовал в последний раз. Я прочитал ссылки классов Java друг на друга, но, к сожалению, мне не удалось решить проблему.

pumpkinpie 06.10.2023 15:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш MyFrame выглядит нормально — вы можете передать экземпляр Main конструктору, и он даже сохраняется в переменной экземпляра main.

Однако в main.Main.main() есть такие строки:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run()
        {
            this.myJFrame = new MyJFrame(this);
        }
    });
}

Компилятор фактически должен отказаться от компиляции. При разрешении this единственным доступным экземпляром является анонимный исполняемый файл, который вы создали с помощью new Runnable(), который не является производным от Main.

Кроме того, Java запускает метод public static void main(...) без создания экземпляра Main, поэтому у вас нет ничего, на что можно было бы сослаться.

Поэтому измените одну строку на что-то вроде

this.myJFrame = new MyJFrame(new Main());

и он должен скомпилироваться. Будет ли это то, что вам нужно, зависит только от вас.

Спасибо за совет. Я добавил «Main main = new Main();» к моему основному методу. Я передаю эту ссылку для запуска следующим образом: «MyJFrame myFrame = new MyJFrame(main);» Сейчас он компилируется, но, к сожалению, я получаю NullPointers, когда использую методы класса, потому что экземпляры по-прежнему неверны. Вот мой новый основной класс Pastebin.com/eSehNMC0

pumpkinpie 06.10.2023 16:44
Ответ принят как подходящий

«... Как мне передать ссылку на основной класс в мой класс JFrame? ...»

Вам не нужно будет передавать экземпляр в MyJFrame.

public MyJFrame()
{
    super("MyJFrame");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 400);
    setVisible(true);
    setResizable(false);
    addWindowListener(this);
}

И создайте экземпляр Main, поскольку вы хотите получить к нему доступ из замыкания ignoreLater.

Main main = new Main();
SwingUtilities.invokeLater(() -> main.myJFrame = new MyJFrame());
public int addOne(int amount)
{
    return myJFrame.getNumber();
}

Я внедрил это в свою программу, и она работает как шарм. Большое спасибо!

pumpkinpie 07.10.2023 12:58

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