我正在尝试编写一段代码,当我选中两个复选框中的一个复选框时,它将更改我选择按钮时显示的消息。
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);”
如何解决这个问题?
我建议您创建一个构造函数,并避免在这种情况下使用静态变量:
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);
}
}
这里的问题是,您在静态方法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";
将消息字段设置为静态:
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)不能从静态上下文中引用。