【问题标题】:setVisible() method not works in static methodsetVisible() 方法在静态方法中不起作用
【发布时间】:2014-05-05 04:49:15
【问题描述】:

我是 JFrame 的新手,正在尝试做一个项目,如果按下注销按钮,以下代码将完美执行,

public void actionlogout() {
    lButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            try {
                new Login();
                setVisible(false);
                dispose();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

现在我的问题是,当我尝试从同一个包中的另一个文件调用相同的 actionlogout 时,它要求将方法的类型更改为静态,所以我已将方法更改为静态,但它在 setVisible(false)

Cannot make a static reference to the non-static method setVisible(boolean) from the type Window

我现在要做什么?

【问题讨论】:

    标签: java swing jframe


    【解决方案1】:

    这是因为 setVisible 是非静态方法,而您正试图从静态代码/方法块中引用它,

    在 java 中,静态的东西在类加载时首先被加载,它不会知道任何非静态成员,所以当你尝试从静态块中引用非静态的东西时,它会给出这个错误。

    您必须从非静态代码块中调用 setVisible,这是唯一的解决方案。

    【讨论】:

    • 最初我只是这样做,但现在我想对另一个文件使用相同的方法。有没有其他方法可以一次又一次地为多个文件调用相同的方法,因为我不想为每个文件编写方法....
    • 您可以创建该类的对象并调用该方法。我建议你参考那里的 oracle java 教程,你会很好地学习所有这些
    【解决方案2】:

    您正在调用方法setVisible(),这是一个实例方法,这意味着它附加到一个对象实例。所以,你不能在没有引用任何拥有它的对象的情况下调用它。为了调用它,您需要将其设为静态方法。因此,它将成为类的成员,而不是任何对象。

    您可以将static 修饰符添加到方法setVisible()。但是,这不能完成,因为它是从Component API 继承的方法。因此,您需要从非静态上下文中进行调用。

    当您希望功能跨多个类时,您可以将其作为实用方法并将其移动到具有所有实用方法的单独类中

    【讨论】:

      【解决方案3】:

      很简单试试这个:

      a = new login();
      a.setVisible();
      

      由于创建的对象是静态的,它应该类似于 setVisible 类型。希望我能解决你的疑问。

      【讨论】:

      • 您可以详细解释 OP 的尝试如何/为什么不起作用,以及您的答案如何以不同的方式实现 OP/问题的预期目标。我是审稿人。由于您是新的贡献者,StackOverflow 请求审查。非常感谢您的回答和帮助。这条评论是为了帮助你得到一个好的答案并让它变得优秀。
      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 2018-09-12
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多