非静态方法问题

时间:2013-07-09 08:19:55

标签: java swing jpanel instance

我知道有很多关于这个问题的帖子,我已经阅读了很多这些但是我无法解决这个问题。
我会尽力以最好的方式提出这个问题,这样就不会太麻烦了。

好吧,我有两个JPanel,我想在应用程序中显示一个JPanel(JCatalog),以便从另一个JPanel(JPanelTicket)修改它。

现在,当我调用JCatalog的方法getComponent时,它会显示non-static method can't be referenced from a static context 我会尝试我所知道的一切,但我搜索了很多,但我不知道如何解决这个问题。

这是我的源代码:

JCatalog的:

package newpackage;
import java.awt.Component;

public class JCatalog extends javax.swing.JPanel {


    public JCatalog() {
        initComponents();
    }

    public Component getComponent() {
        return this;
    }

JPanelTicket:

package javaapplication5;
import javax.swing.JPanel;
import newpackage.JCatalog;


public abstract class JPanelTicket extends JPanel {

    JCatalog jcat;

    public JPanelTicket() {
        initComponents();
    }

    public void init(){
        jcat = (JCatalog) JCatalog.getComponent(); //Here's the problem
    }

5 个答案:

答案 0 :(得分:2)

您无法使用类调用非静态方法,例如JCatalog.getComponent()

只能使用实例jcat.getComponent()

调用非静态方法

我看到您的参考文件名为JCatalog类型为jcat。确保在某处初始化或使用 setter方法设置实例。并使用此实例调用getComponent()方法

public abstract class JPanelTicket extends JPanel {

    JCatalog jcat;

    public JPanelTicket() {
        jcat = new JCatalog();
        initComponents();
    }

    public void init(){
        jcat = jcat.getComponent(); //Here's the problem
    }
}

OR

public abstract class JPanelTicket extends JPanel {

    JCatalog jcat;

    public JPanelTicket() {
        initComponents();
    }

    public void init(){
        jcat = jcat.getComponent(); //Here's the problem
    }

    public void setJCatalog(JCatalog jcat) {
        this.jcat = jcat;
    }
}

答案 1 :(得分:1)

这就是你解决它的方法:

public class JCatalog extends javax.swing.JPanel {
  private static Component INSTANCE;

  public JCatalog() {
      initComponents();
      INSTANCE = this;
  }

  public static Component getComponent() {
    return INSTANCE;
  }

这可以假设您的JCatalog单身,这意味着您只在应用中创建一个实例。

答案 2 :(得分:1)

当您呼叫JCatalog.getComponent();时,您正在以静态方式调用非静态方法。 静态意味着您不必实例化对象以调用方法。

当您键入JCatalog.getComponent();时,您的`JCatalog'尚未实例化。

JCatalog jCatalogObj = new JCatalog();
jcat = jCatalogObj.getComponent();

这样您就可以以非静态方式调用它,因为在调用它的方法之前先创建JCatalog的新实例。

但是如果你要在方法中返回this,你可能只想这样做:

jcat = new JCatalog();

所以我会像这样重写你的代码:

package javaapplication5;
import javax.swing.JPanel;
import newpackage.JCatalog;

public abstract class JPanelTicket extends JPanel {

    JCatalog jcat;

    public JPanelTicket() {
        initComponents();
    }

    public void init(){
        jcat = new JCatalog();
    }
}

答案 3 :(得分:0)

您的getComponent方法是非静态的,并且您尝试以静态方式引用它

您需要一个引用对象来调用getComponent方法

您可以尝试这样:

public void init(){
        jcat = new JCatalog().getComponent(); //Here's the problem
}

答案 4 :(得分:0)

创建JCatalog的对象以访问其方法。您静态访问非静态的方法不起作用。

   public void init(){
       JCatalog jcat = new JCatalog();
       jcat.getComponent();
   }