2013-05-14 73 views
0

我試圖通過點擊JButton添加一個新的卡到現有的JPanel(cardLayout),然後轉到新的卡,但我得到空的異常,因爲新的卡沒有註冊。Java:在運行後面板添加到現有的面板

伊夫試圖尋找谷歌,但不能找到和例子,香港專業教育學院試圖使「拯救」使用

.validate(); 
.refresh(); 
.repaint(); 

但沒有任何工程的佈局,這是可能的動態?如果有的話,是否有人知道任何例子?

下面的代碼,jPanelSliding1.nextSlidPanel只是移動到CardLayout中的選定JPanel。由於未找到面板,此處創建的新面板會導致空錯誤。 謝謝:)

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package partnerships; 

import components.ColorScheme; 
import components.Utilities; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeSupport; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class JSlidingPanel extends javax.swing.JPanel implements PropertyChangeListener { 

    public PropertyChangeSupport pcs = new PropertyChangeSupport(this); 
    private ColorScheme scheme; 

    public JSlidingPanel() { 
     initComponents(); 
     pcs.addPropertyChangeListener(this); 
     scheme = new ColorScheme(); 
     Object[][] object = { 
      {pcs, "Offered", "BT details", scheme.green()}, 
      {pcs, "Sold", "BT details", scheme.pink()}, 
      {pcs, "Other", "BT details", scheme.purple()} 
     }; 

     jPanelSliding1.add(makePanels(object)); 
    } 

    private void setupGUI() { 
    } 

    private JPanel makePanels(Object[][] objects) { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, objects.length)); 
     for (Object[] properties : objects) { 
      panel.add(new ObjectPanel((PropertyChangeSupport) properties[0], properties[1].toString(), properties[2].toString(), (Color) properties[3])); 
     } 
     return panel; 
    } 

    private void newPanel(String str) { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     panel.add(new JButton()); 
     jPanelSliding1.add(panel); 

     jPanelSliding1.refresh(); 
     jPanelSliding1.validate(); 
     jPanelSliding1.repaint(); 

     validate(); 
     repaint(); 
     Utilities.getTopFrame().pack(); 
     jPanelSliding1.NextSlidPanel(10, panel); 
     jPanelSliding1.refresh(); 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     if (this.isVisible() == true) { 
//   makePanels(); 
      newPanel(evt.getPropertyName()); 
     } 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       JPanel panel = new JPanel(); 
       JSlidingPanel app = new JSlidingPanel(); 

       panel.add(app); 
       frame.add(panel); 
       frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 
       frame.setVisible(true); 
       frame.pack(); 
      } 
     }); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jPanelSliding1 = new apps.JPanelSliding(); 

     setPreferredSize(new java.awt.Dimension(900, 600)); 
     setLayout(new java.awt.BorderLayout()); 

     jPanelSliding1.setLayout(new java.awt.CardLayout()); 
     add(jPanelSliding1, java.awt.BorderLayout.CENTER); 
    }// </editor-fold>      
    // Variables declaration - do not modify      
    private apps.JPanelSliding jPanelSliding1; 
    // End of variables declaration     
} 
+0

請添加一些代碼,無論你到現在新parentPanelLayout。 – eatSleepCode 2013-05-14 09:40:56

+0

按要求,任何問題讓我知道。謝謝。 – user2265815 2013-05-14 09:47:36

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-05-14 10:33:52

回答

0

找到了我的問題的答案,出於某種原因,我不得不命名創建後面板,否則它永遠找不到。謝謝您的幫助。

 JPanel panel = new JPanel(); 
**panel.setName("abc");** 
     panel.setLayout(new BorderLayout()); 
2

,如果你只是處理一些事件改變你的窗口的卡,以下可能會有所幫助。

Oracle Tutorial example

+0

...完全同意+1,很難負責 – mKorbel 2013-05-14 09:55:48

+0

謝謝,但我知道如何在Cardlayout中設置面板/卡片,但我需要在用戶單擊按鈕時添加新卡片。所以我需要添加一張卡片,然後在java已經運行的時候轉到該卡片。 – user2265815 2013-05-14 10:07:06

+0

你能檢查一下嗎? http://stackoverflow.com/a/9425769/2381006 – 2013-05-14 10:14:28

1

我不知道,如果這可以工作,但:

我看到的是,你正在試圖「刷新/重繪/驗證」的jPanelSliding值。相反,你應該修改是你試圖點擊的面板。 jPanelSliding可能會被更新,但面板(在main上聲明)沒有被實現。

那麼,你爲什麼不嘗試對主要聲明的面板進行「驗證」調用?

你可以試試看,並告訴我們它是否有效?

+0

我試過,但即時嘗試顯示/激活新的JPanel時,仍然得到空。它可以工作,如果我有10個空卡,然後添加一個新的對象到一個空的然後顯示。所以我想這可能是我最好的選擇。只需要跟蹤什麼地方。 – user2265815 2013-05-14 10:45:43

+0

試圖標記爲有用,但我的代表太低,對不起米克爾。 :) – user2265815 2013-05-14 10:48:01

0

我也在處理同樣的問題。
經過一些測試,再測試和大量的失敗我的僞算法是這樣的:

parentPanel:包含我們要刪除
childPanel面板:面板我們要切換
parentPanelLayout:parentPanel
佈局 editParentLayout():建立parentPanel不同childPanel每一次

parentPanel.remove(childPanel); 
editParentLayout(); 
parentPanel.revalidate(); 
parentPanel.repaint();