2013-05-14 49 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();