0

我知道有很多关于这个问题的帖子,我已经阅读了很多,但我无法解决我的问题。
我会尽量以最好的方式提出问题,以免造成太多麻烦。

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

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

这是我的源代码:

目录:

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

5 回答 5

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

或者

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;
    }
}
于 2013-07-09T08:21:57.403 回答
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();
    }
}
于 2013-07-09T08:28:04.913 回答
1

这就是你解决它的方法:

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

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

  public static Component getComponent() {
    return INSTANCE;
  }

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

于 2013-07-09T08:25:08.253 回答
0

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

   public void init(){
       JCatalog jcat = new JCatalog();
       jcat.getComponent();
   }
于 2013-07-09T08:24:47.457 回答
0

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

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

你可以这样尝试:

public void init(){
        jcat = new JCatalog().getComponent(); //Here's the problem
}
于 2013-07-09T08:23:03.233 回答