无法从静态上下文中引用非静态变量: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) ;  

变量frenchReportCard的实例字段,它在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) ;   
 }