2012-05-07 90 views
2

當Netbeans擴展JPanel時,當引用自動生成的類的實例時,是否會產生問題,因爲它使用繼承而不是組合?class is -a-JPanel when it have -a

由於Netbeans聲明JPanel爲private javax.swing.JPanel overview;,因此實例具有一種JPanel類型,它應具有一種Overview類型。

如何調用setGroup方法,並將Overview作爲自動生成的JPanel保存?我試着像這樣:

Main.java

private void groupsPropertyChange(java.beans.PropertyChangeEvent evt) { 
    String s = evt.getNewValue().toString(); 
    LOG.fine("new group: " + s); 
    overview.setGroup(s); 
} 

與Overview.java:

public class Overview extends javax.swing.JPanel { 


... 

    public String getGroup() { 
     return group; 
    } 

    public void setGroup(String group) { 
     this.group = group; 
    } 

} 

,但得到這個編譯錯誤:

init: 
Deleting: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties 
deps-jar: 
Updating property file: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties 
Compiling 1 source file to /home/thufir/NetBeansProjects/SwingNNTP/build/classes 
warning: [options] bootstrap class path not set in conjunction with -source 1.5 
/home/thufir/NetBeansProjects/SwingNNTP/src/net/bounceme/dur/nntp/view/Main.java:59: error: cannot find symbol 
     overview.setGroup(s); 
    symbol: method setGroup(String) 
    location: variable overview of type JPanel 
1 error 
1 warning 
/home/thufir/NetBeansProjects/SwingNNTP/nbproject/build-impl.xml:628: The following error occurred while executing this line: 
/home/thufir/NetBeansProjects/SwingNNTP/nbproject/build-impl.xml:285: Compile failed; see the compiler error output for details. 
BUILD FAILED (total time: 1 second) 
+0

你在哪裏實例化Overview類? – Stephan

+0

概述在Main類中實例化,但它太垃圾了,我省略了它,因爲它是自動生成的;它在'initComponents'方法中。 – Thufir

+0

我認爲你的問題。看看這個錯誤:'位置:JPanel類型的變量概述「。概述是面板的一個變量。你沒有實例化一個Overview對象。 – Stephan

回答

4

A JPanel與合適的layout對於一個或多個JComponent實例是方便的Container。它提供了一個(基本)用戶界面委託和雙緩衝,但沒有其他。自定義組件應該可能直接擴展JComponent。 (可選)UI代理的基礎結構顯示爲here。您可以將這些自定義組件添加到here討論的設計器調色板中。

+0

tools-> Palette-> Swing/AWT Componets,然後選擇「從項目添加」並選擇一個擴展的類,在這種情況下,JPanel?即使在清理和構建之後,此窗口中也不會出現類。 「構建」文件夾中的任何類都不做。仍在研究它,謝謝。 – Thufir

+0

@Thufir:恐怕我沒有在兔子洞裏走得太遠,但還有更多[這裏](http://platform.netbeans.org/tutorials/nbm-palette-api2.html)。 – trashgod

+0

謝謝,我應該首先使用Google搜索!我稍微看一下。 – Thufir

2

嗯,我想沒有按Netbeans的沒有這樣一種選擇,將使用GUI創建的JPanel聲明爲除JPanel之外的任何類型,這有點奇怪。爲什麼擴展JPanel,如果與Netbeans GUI構建器保持一致,那麼您不能使用該擴展類型實例化JPanel的子類?這並不是說擴展的JPanel在本質上是個好主意......

解決方案代碼:

package net.bounceme.dur.nntp.view; 

import java.util.logging.Logger; 
import javax.swing.JTabbedPane; 

public class MyTabs extends JTabbedPane { 

    private static final Logger LOG = Logger.getLogger(MyTabs.class.getName()); 
    private Overview overview = new Overview(); 
    private Detail details = new Detail(); 
    private Groups groups = new Groups(); 

    public MyTabs() { 
     this.add("groups", groups); 
     this.add("overview", overview); 
     this.add("detail", details); 

     groups.addPropertyChangeListener(new java.beans.PropertyChangeListener() { 

      public void propertyChange(java.beans.PropertyChangeEvent evt) { 
       String s = evt.getNewValue().toString(); 
       LOG.fine(s); 
       overview.setGroup(s); 
      } 
     }); 

    } 
} 

我只是好奇,如果有這樣的一些更好的方法,比不使用的GUI構建器等。

+0

+1表示鬆耦合;您還可以聽取選項卡式窗格的「模型」。另外,這是一個_GUI_設計器,而不是_application_設計器。 :-) – trashgod

相關問題