«Измените модификатор ‘frame’ на ‘static'» в Java

#java #static #jframe

#java #статический #jframe

Вопрос:

Eclipse говорит мне изменить модификатор моей строковой переменной на static. Я не понимаю, почему. Я думаю, что я объявляю все правильно, но я не уверен. Вот мой код. Проблема возникает в обеих строках 12 и 13.

 import java.awt.*;
import javax.swing.*;
public class MainClass {


    Rectangle dot1 = new Rectangle(1,1), dot2 = new Rectangle(1,1);
    JFrame frame = new JFrame("Pythagorean Theorem");


    public static void main (String[] args){

        frame.setVisible(true);
        frame.setSize(500, 500);

    }


}
  

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

1. I'm being told by Eclipse to change the modifier of my string variable to static — Пожалуйста, поймите, что Java / Eclipse не сообщает вам об этом. Скорее, это говорит вам, что вы не можете создать статическую ссылку на нестатическую переменную или метод. Это большая разница. Причина, по которой это важно, заключается в том, чтобы вы не неправильно истолковали ошибку, поскольку она не говорит вам сделать переменную статической, и мы тоже.

Ответ №1:

frame является переменной экземпляра MainClass, что означает, что вам нужен экземпляр MainClass для доступа к нему. Статическая переменная принадлежит классу и не требует экземпляра. Вообще говоря, вам следует избегать статического хранения данных, поскольку их сложно модифицировать и тестировать.

Скорее создайте экземпляр MainClass в вашем основном методе, а затем получите доступ к вашему фрейму внутри метода экземпляра.

 public class MainClass {
    Rectangle dot1 = new Rectangle(1,1), dot2 = new Rectangle(1,1);
    JFrame frame = new JFrame("Pythagorean Theorem");

    public void buildUI() {
        frame.setVisible(true);
        frame.setSize(500, 500);
    }

    public static void main (String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainClass().buildUI();
            }
        });
    }
}
  

РЕДАКТИРОВАТЬ Обратите внимание, что при работе с Swing, когда вы создаете / касаетесь компонентов пользовательского интерфейса, вам нужно сделать это в потоке отправки событий (EDT), что invokeLater и делает.

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

1. Это ничем хорошим не закончится. В потоке отправки событий ничего не делается.

Ответ №2:

Вы определяете frame как переменную экземпляра, но используете ее как статическую переменную. Для этого есть два решения:

1) Вы можете изменить модификатор frame на static

2) Создайте экземпляр вашего класса, вот так:

 public static void main (String[] args){
    MainClass mc = new MainClass();
    mc.frame.setVisible(true);
    mc.frame.setSize(500, 500);
}