Нестатическая переменная, на которую нельзя ссылаться из статического контекста. JFrame

1

У меня есть этот код:

private static void inputGUI() {
    inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    inputFrame.setTitle("The INPUT");
    panel.add(printButton);
    printButton.setBounds(135,560,120,30);
    inputFrame.setLayout(null);
    inputFrame.add(panel);
    panel.setBounds(1000,100,366,768-100);

    //ActionListeners!!!    
    printButton.addActionListener(this);
    inputFrame.setSize(1366,768);
    inputFrame.setVisible(true);
}

Я хотел добавить слушателя действий к моему JButton с именем

printButton

У меня также есть JFrame

inputFrame

и это в моей главной

public static void main (String[] args) {
    inputGUI();
}

Но я продолжаю получать эту ошибку:

error: non-static variable this cannot be referenced from a static context

Как я могу это сделать? Было бы здорово, если бы вы, ребята, могли мне помочь, не используя анонимный внутренний класс (мой учитель еще не научил нас этому уроку). Спасибо!

  • 0
    Нам нужно увидеть весь класс, чтобы диагностировать вашу проблему. В идеале вы должны сначала исключить ненужные детали из своего кода, а затем привести короткий пример, который позволит нам воспроизвести проблему.
  • 0
    Вы можете сделать свой метод нестатичным.
Показать ещё 1 комментарий
Теги:
swing
static
constructor
jframe

2 ответа

0
Лучший ответ

Проблема заключается в следующем коде.

 printButton.addActionListener(this);

Причина:
inputGUI() является статическим, в результате которого отрицается использование this ключевого слова, которое ссылается на текущий объект.

Решение:
Просто создайте новый объект класса, который обрабатывает события printButton. За это отвечает MainClass. Измените свой код следующим образом:

 printButton.addActionListener(new MainClass());

Альтернативное решение:
Сделайте inputGUI() не статическим. И назовите его из основного метода как new MainClass().inputGUI(). Остальное остается таким же.

0
import java.awt.event.ActionEvent;
import javax.swing.*;

public class NewClass {


    public NewClass(){
     //inputGUI();
    }
    public static void method(){
      JOptionPane.showMessageDialog(null, "");
    }
    private static void inputGUI() {
    JFrame inputFrame = new JFrame();
    JPanel panel = new JPanel();
    JButton printButton = new JButton();
    inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    inputFrame.setTitle("The INPUT");
            panel.add(printButton);
                printButton.setBounds(135,560,120,30);
    inputFrame.setLayout(null);
        inputFrame.add(panel);
    panel.setBounds(1000,100,366,768-100);

    //ActionListeners!!!    
        printButton.addActionListener(new java.awt.event.ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
              method();
            }
        });
inputFrame.setSize(1366,768);
inputFrame.setVisible(true);
}
    public static void main(String[]args){
     inputGUI();   
    }
}

вы имеете в виду вот так?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню