Java 非静态方法问题

Java 非静态方法问题,java,swing,jpanel,instance,Java,Swing,Jpanel,Instance,我知道有很多关于这个问题的帖子,我读了很多,但我无法解决我的问题。 我会尽量用最好的方式问这个问题,这样就不会太麻烦了 好的,我有两个JPanel,我想让应用程序中显示的一个JPanel(JCatalog)从另一个JPanel(JPanelTicket)修改它 现在,当我调用JCatalog的getComponent方法时,它显示了非静态方法不能从静态上下文引用 我会尝试我知道的一切,我搜索了很多,但我不知道如何解决这个问题 这是我的源代码: JCatalog: package newpacka

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

好的,我有两个JPanel,我想让应用程序中显示的一个JPanel(JCatalog)从另一个JPanel(JPanelTicket)修改它

现在,当我调用JCatalog的getComponent方法时,它显示了
非静态方法不能从静态上下文引用

我会尝试我知道的一切,我搜索了很多,但我不知道如何解决这个问题

这是我的源代码:

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

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


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

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

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


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

您需要一个引用对象来调用
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 void init(){
        jcat = new JCatalog().getComponent(); //Here's the problem
}

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

您需要一个引用对象来调用
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 void init(){
        jcat = new JCatalog().getComponent(); //Here's the problem
}

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

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

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

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

这就是解决问题的方法:

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

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

  public static Component getComponent() {
    return INSTANCE;
  }

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

这就是您解决问题的方法:

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

调用
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是一个非静态方法。所以你需要一个对象来调用它<代码>jcat=(JCatalog)JCatalog.getComponent()是错误的。你需要一个JCatalog对象。“我读了很多”真的吗?链接到与您的查询最接近的5个,并解释他们以何种方式未能回答问题。您想做什么?getComponent是一个非静态方法。所以你需要一个对象来调用它<代码>jcat=(JCatalog)JCatalog.getComponent()是错误的。你需要一个JCatalog对象。“我读了很多”真的吗?链接到与您的查询最接近的5个,并解释它们以何种方式无法回答。因此,如果我执行类似于
JCatalog jcat=new JCatalog()
的操作,然后执行
JCatalog jcat2=(JCatalog)jcat.getComponent()它将显示JCatalog的实例?是的,它应该可以工作。。但请确保您使用的是正确的
JCatalog
实例,如果我执行类似
JCatalog jcat=new JCatalog()
的操作,然后执行
JCatalog jcat2=(JCatalog)jcat.getComponent()它将显示JCatalog的实例?是的,它应该可以工作。。但是请确保您使用的是正确的
JCatalog
实例,我也读过,但不知道如何实现它,谢谢!我也读过,但不知道如何实现,谢谢!