非静态方法问题



我知道有很多关于这个问题的帖子,我读了很多,但我无法解决我的问题
我会尽量用最好的方式问这个问题,这样就不会有太多麻烦。

好吧,我有两个JPanel,我想在应用程序中显示一个JPanell(JCatalog),以从另一个JPpanel(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
    }

不能使用类调用非静态方法,如JCatalog.getComponent()

非静态方法只能用实例jcat.getComponent() 调用

我看到您维护了一个名为jcatJCatalog类型的引用。确保在某个地方初始化,或者使用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
    }
}

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

这就是解决问题的方法:

public class JCatalog extends javax.swing.JPanel {
  private static Component INSTANCE;
  public JCatalog() {
      initComponents();
      INSTANCE = this;
  }
  public static Component getComponent() {
    return INSTANCE;
  }

这将在假设JCatalog单例的情况下工作,这意味着您在应用程序中只创建一个实例。

当您调用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();
    }
}

您的getComponent方法是非静态的,您正试图在静态样式中引用它

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

你可以这样尝试:

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

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

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

最新更新