无法从静态上下文中引用非静态变量:GUI 新手
Non-Static Variable Cannot be Referenced From a Static Context: New to GUIs
每当我编译它时,我都会收到一个错误 "non-static variable french cannot be referenced from a static context"。我刚开始使用 GUI,但找不到答案。我确定这很简单,但我无法弄清楚!
如有任何帮助,我们将不胜感激。
public class ReportCard {
JTextField french = new JTextField ("French Grade") ;
public static void main (String args[]) {
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
我强烈建议阅读有关静态如何工作的内容,有很多人可以比我更好地解释它 can.For 现在您可以做一些事情。
使法语静态化
static JTextField french = new JTextField ("French Grade") ;
或者将其放入 main 方法中,因为它已经在静态上下文中,所以本质上会使它成为静态的。
public class ReportCard {
public static void main (String args[]) {
JTextField french = new JTextField ("French Grade") ;
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
变量french
是ReportCard
的实例字段,它在ReportCard
的实例之外没有上下文或意义,这意味着除非你先创建一个实例ReportCard
,您不能引用该变量。
虽然您可以 french
static
,但这会让您走上一条充满潜在问题的黑暗道路,通常是个坏主意,static
参考很容易成为改变了,你的整个程序就分崩离析了。 static
也不是跨对象通信机制,永远不应该这样使用。
相反,您可以使用 ReportCard
创建您的 UI,例如...
public class ReportCard {
JTextField french = new JTextField ("French Grade") ;
public static void main (String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ReportCard reportCard = new ReportCard();
reportCard.start();
}
}
}
public void start() {
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
}
每当我编译它时,我都会收到一个错误 "non-static variable french cannot be referenced from a static context"。我刚开始使用 GUI,但找不到答案。我确定这很简单,但我无法弄清楚!
如有任何帮助,我们将不胜感激。
public class ReportCard {
JTextField french = new JTextField ("French Grade") ;
public static void main (String args[]) {
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
我强烈建议阅读有关静态如何工作的内容,有很多人可以比我更好地解释它 can.For 现在您可以做一些事情。 使法语静态化
static JTextField french = new JTextField ("French Grade") ;
或者将其放入 main 方法中,因为它已经在静态上下文中,所以本质上会使它成为静态的。
public class ReportCard {
public static void main (String args[]) {
JTextField french = new JTextField ("French Grade") ;
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
变量french
是ReportCard
的实例字段,它在ReportCard
的实例之外没有上下文或意义,这意味着除非你先创建一个实例ReportCard
,您不能引用该变量。
虽然您可以 french
static
,但这会让您走上一条充满潜在问题的黑暗道路,通常是个坏主意,static
参考很容易成为改变了,你的整个程序就分崩离析了。 static
也不是跨对象通信机制,永远不应该这样使用。
相反,您可以使用 ReportCard
创建您的 UI,例如...
public class ReportCard {
JTextField french = new JTextField ("French Grade") ;
public static void main (String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ReportCard reportCard = new ReportCard();
reportCard.start();
}
}
}
public void start() {
JFrame frame = new JFrame ("Report Card") ;
frame.setSize(400 , 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
JPanel bigPanel = new JPanel() ;
frame.getContentPane().add(bigPanel) ;
bigPanel.add(french) ;
}