2013-07-09 3 views
0

이 문제의 게시물이 많다는 것을 알고 있습니다. 많은 내용을 읽었지만 해결할 수 없습니다.
나는 가능한 한 최선의 방법으로 질문을 시도하므로 너무 많은 문제는 발생하지 않습니다.비 정적 메서드 문제

글쎄, 나는 두 개의 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 
    } 
+0

무엇 너하고 싶니? getComponent는 비 static 메소드입니다. 따라서 객체를 호출해야합니다. 'jcat = (JCatalog) JCatalog.getComponent();'가 잘못되었습니다. JCatalog 객체가 필요합니다. – zsxwing

+0

* "많이 읽었습니다"* 정말요? 귀하의 질의에 가장 근접한 5 개의 페이지에 링크하여 그들이 대답하지 못한 방법을 설명하십시오 .. –

+0

[crossposted] (http://www.coderanch.com/t/615326/java/java/Calling-method- JPanel) – mKorbel

답변

2

당신은 JCatalog.getComponent()

는 A, 비 정적 메서드 사용하여 클래스를 호출 할 수 없습니다 비 정적 메서드는 인스턴스으로 만 호출 할 수 있습니다.210

참조 번호가 JCatalog이고 참조 번호가 jcat으로 유지되는 것을 확인했습니다. 을 어딘가에 초기화하거나 설정 메소드을 사용하여 인스턴스를 설정하십시오. 그리고 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; 
    } 
} 
+0

그래서 'JCatalog jcat = new JCatalog()'와'JCatalog jcat2 = (JCatalog) jcat.getComponent(); '와 같이하면 JCatalog의 인스턴스가 표시됩니까? – Mueretee

+0

네, 작동해야합니다.하지만'JCatalog'의 ** 올바른 인스턴스 **로 작업하고 있는지 확인하십시오. – sanbhat

+0

고마워, 이걸 해봐! – Mueretee

0

귀하의 getComponent 방법은 비 정적이며, 당신이 참조 객체가 필요

정적 스타일을 참조하려고 전화를이 인스턴스를 사용 getComponent 메서드를 호출하는 방법

다음과 같이 시도 할 수 있습니다.

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

메소드에 액세스하려면 JCatalog 객체를 만듭니다. 정적이 아닌 방식으로 액세스하는 정적 방법은 작동하지 않습니다.

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

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

    public static Component getComponent() { 
    return INSTANCE; 
    } 

이 당신의 JCatalog 당신은 응용 프로그램에서 하나 개의 인스턴스를 생성 의미 싱글이다 가정하에 작동합니다

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

이것은 당신이 그것을 해결하는 방법입니다.

+0

이것에 대해서도 읽었지만 구현 방법을 몰랐습니다. 감사합니다! – Mueretee

1

전화 할 때 JCatalog.getComponent(); 정적 방법으로 비 정적 방법을 호출하고 있습니다. 정적이란 메서드를 호출하기 위해 개체를 인스턴스화 할 필요가 없다는 것을 의미합니다.

JCatalog.getComponent();을 입력하면 'JCatalog'가 아직 인스턴스화되지 않습니다.당신이 메소드의 호출 전에 JCatalog 최초의 새로운 인스턴스를 생성하기 때문에

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

이 방법 당신은 비 정적 방식으로 호출됩니다. 이 방법에서 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(); 
    } 
}