当前位置: 首页 > 知识库问答 >
问题:

无法从静态上下文引用非静态变量

吕皓
2023-03-14

我正在尝试编写一段代码,当我选中两个复选框中的一个复选框时,它将更改我选择按钮时显示的消息。

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

public class  FirstWindow extends JFrame{

        String message;

        public static void main(String[] args){

            //the string to show the message for button 1
            message = "goodjob \n";

            //all of the main window
            JFrame frame = new JFrame("heading");
            frame.setVisible(true);
            frame.setSize(600,400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);

            //makes seperate panels
            JPanel panel1 = new JPanel();
            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel(new GridBagLayout());

            //set of buttons
            JButton button1 = new JButton("Button 1");
            JButton button2 = new JButton("Button 2");

            //makes an ACTION LISTENER, which tells the button what to do when
            //it is pressed.
            button1.addActionListener(new ActionListener(){

                    //the command to button 
                    @Override
                    public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, message);

                    }
        });

            //for panel adds buttons
            panel1.add(button1);
            panel1.add(button2);

            //set of checkboxes 
            JCheckBox checkBox = new JCheckBox("Option1");
            JCheckBox checkBox2 = new JCheckBox("Option2");

            //adds text if the box is checked
                if (checkBox.isSelected())
                {
                    message += "you picked option 1";
                }
            if (checkBox2.isSelected())
                {
                    message += "you picked option 2";
                }   

            //for panel2 adds checkboxes
            panel2.add(checkBox);
            panel2.add(checkBox2);

            //makes a new label, text area and field
            JLabel label = new JLabel("This is a label");
            JTextArea textArea = new JTextArea("this is a text area");
            JTextField textField = new JTextField("text field");

            //makes an invisible grid
            GridBagConstraints grid = new GridBagConstraints();
            grid.insets = new Insets(15, 15, 15, 15);

            //sets the the coordinates 0,0. adds the label, and sets position
            grid.gridx = 0;
            grid.gridy = 0;
            panel3.add(label, grid);

            //sets the the coordinates 0,1. adds the textArea, and sets position
            grid.gridx = 0;
            grid.gridy = 1;
            panel3.add(textArea, grid);

            //sets the the coordinates 0,2. adds the text field, and sets position
            grid.gridx = 0;
            grid.gridy = 2;
            panel3.add(textField, grid);

            //adds each PANEL to the FRAME and positions it
            frame.add(panel1, BorderLayout.SOUTH);
            frame.add(panel3, BorderLayout.CENTER);
            frame.add(panel2, BorderLayout.NORTH);

        }
}

我收到的错误消息是:

"FirstWindow.java:12:错误:不能从静态上下文消息中引用非静态变量消息="good job\n";"

对于第12、37、53、57行。我已尝试在main中声明字符串变量,但我只会收到错误:

“FirstWindow。java:38:错误:从内部类引用的局部变量必须是final或有效的final JOptionPane。showMessageDialog(null,message);”

如何解决这个问题?

共有3个答案

傅穆冉
2023-03-14

我建议您创建一个构造函数,并避免在这种情况下使用静态变量:

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

public class  FirstWindow extends JFrame{

    private String message;

    FirstWindow (){

        super("heading");

        //the string to show the message for button 1
        message = "goodjob \n";

        //all of the main window
        // remove this: JFrame frame = new JFrame("heading");
        // remove this: frame.setVisible(true);

        // change frame.setSize(600,400); by:
        setSize(600,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // the rest of your code with the JFrame instantiation
        // ...

        //adds each PANEL to the FRAME and positions it
        // here also change frame.add(... by just add(... as follows
        add(panel1, BorderLayout.SOUTH);
        add(panel3, BorderLayout.CENTER);
        add(panel2, BorderLayout.NORTH);
    }

    public static void main(String[] args){

        new FirstWindow().setVisible(true);
    }

}
上官扬
2023-03-14

这里的问题是,您在静态方法public static void main()之外声明了非静态变量字符串消息。所以有三种可能的解决方案

>

  • 在main方法内声明字符串消息

    public static void main(String []args){
    String message = "goodjob \n";
    

    根据上面的答案,您可以将String消息更改为静态

    static String message;
    public static void main(String []args){
    message = "goodjob \n";
    

    创建FirstWindow类的对象,然后访问字符串消息

    FirstWindow sampleFirst = new FirstWindow();
    sampleFirst.message = "goodjob \n";
    

  • 帅博简
    2023-03-14

    将消息字段设置为静态:

    static String message;
    

    您的主类是静态的(必须如此)。这意味着您没有类的实例。但字段消息目前不是静态的,这意味着它只作为实例的一部分存在。由于您没有实例,因此无法访问它。

    作为附带说明:我强烈建议您找人对这段代码进行代码审查。有很多东西需要学习。考虑将其提交给Code Review。

     类似资料:
    • 我在阅读Kathy and Bert SCJP1.6时遇到了以下代码: 虽然是在跟踪变量的主题下,但我无法理解如何在main()方法(static)中引用非静态变量myBar?

    • 我尝试使用网络豆IDE在java中创建一个简单的类。每当我试图执行这个命令时,它都会发出这样的警告。从静态上下文引用的非静态变量“。谁能告诉我为什么会发生这种情况以及如何解决它。提前感恩节。

    • 我是Android编码的n00b,今天我想尝试使用定位服务。 我设置了一个简单的类和一个简单的main,只是为了得到经度和纬度。 但当我尝试调用retrive的构造时,long and latitude Android Studio弹出了一个错误: 错误:(33,16)错误:无法从静态上下文引用非静态变量纬度 这是我的位置班

    • 我编写了以下测试代码: 但会出现以下错误: 我如何让我的方法识别我的类变量?

    • 可能重复: 为什么我得到“非静态变量不能从静态上下文引用”? 这是代码 错误说: 不能从静态上下文引用非静态类节点 为什么我不应该在main()方法中引用Node类?

    • 我正在编写此代码,它显示了错误非静态方法googleapiability . isgoogleplayservicesavailable(上下文上下文)和googleapiability . get error dialog(Activity Activity,int errorCode,int requestCode)不能从静态上下文中引用。