【问题标题】:Non-Static Variable Cannot be Referenced From a Static Context: New to GUIs不能从静态上下文引用非静态变量:GUI 的新功能
【发布时间】:2015-02-21 02:20:03
【问题描述】:

每当我编译它时,我都会收到错误消息“无法从静态上下文引用非静态变量法语”。我刚刚开始使用 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) ;   

【问题讨论】:

标签: java user-interface variables static jtextfield


【解决方案1】:

我强烈建议阅读有关静态工作原理的信息,有很多人可以比我更好地解释它。现在你可以做几件事。 使法语静态

 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) ;  

【讨论】:

  • static,或者“全局”变量在普通编程中是一个坏主意,它们在 GUI 环境中的 API 中是一个完全的痛苦,很容易改变变量的引用没想到整个程序都崩溃了。更好的解决方案是使用 ReportCard 类的构造函数或其他方法来构建 UI,并使用 main 方法来启动它...
【解决方案2】:

变量frenchReportCard的实例字段,它在ReportCard的实例之外没有上下文或意义,这意味着除非你首先创建ReportCard的实例,否则你可以' t 引用变量。

虽然您可以创建 french static,但这会导致您走上一条潜在问题的黑暗道路,而且通常是个坏主意,但很容易更改 static 引用并让您的整个程序分崩离析. static 也不是跨对象通信机制,因此永远不应该这样使用。

相反,您可以使用ReportCard 来创建您的用户界面,例如...

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) ;   
 }

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多