2013-07-09 129 views
0

我知道這個問題有很多帖子,我讀了很多,但我無法解決我的問題。
我會盡量以最好的方式提出問題,這樣不會太麻煩。非靜態方法問題

那麼,我有兩個JPanels,我想要得到一個在應用程序中顯示的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是一種非靜態方法。所以你需要一個對象來調用它。 '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()

一非靜態方法只能用實例調用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 
    } 
} 

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; 
    } 
} 
+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 void init(){ 
     JCatalog jcat = new JCatalog(); 
     jcat.getComponent(); 
    } 
1

這是你如何解決這個問題:

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

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

    public static Component getComponent() { 
    return INSTANCE; 
    } 

這將是你的JCatalog,這意味着你只能在你的應用程序中創建一個實例的假設下工作。

+0

我也讀過這個,但不知道如何實現它,謝謝! – Mueretee

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