Как мне передать ссылку на основной класс в мой класс 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);
подсказка: узнайте разницу между статическими и нестатическими методами.
Я обновил код до того, что пробовал в последний раз. Я прочитал ссылки классов Java друг на друга, но, к сожалению, мне не удалось решить проблему.




Ваш 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
«... Как мне передать ссылку на основной класс в мой класс 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();
}
Я внедрил это в свою программу, и она работает как шарм. Большое спасибо!
Итак, какой экземпляр
Mainвы хотите передать в качестве ссылки конструкторуMyJFrame? (Подсказка: на данный момент я не вижу ни одного случая созданияMain...) Кроме того, информации «это не сработало» никогда не бывает достаточно — всегда показывайте точную ошибку (или какое-то нежелательное поведение) и объясняйте как вы пытались это исправить или что вы в этом не понимаете.