Java:运行后将面板添加到现有面板

Java:运行后将面板添加到现有面板,java,swing,jpanel,repaint,cardlayout,Java,Swing,Jpanel,Repaint,Cardlayout,我试图添加一个新的卡到一个现有的JPanel(cardLayout)点击JButton,然后转到新卡,但我得到空异常,因为新卡没有注册 我试着在谷歌上搜索,但找不到和示例,我试着用 .validate(); .refresh(); .repaint(); 但什么都不起作用,这是可能的吗?如果有,有人知道任何例子吗 在下面的代码中,jPanelSliding1.nextSlidPanel只需移动到CardLayout中选定的JPanel。此处创建的新面板由于找不到面板而导致空错误。 谢谢:) /

我试图添加一个新的卡到一个现有的JPanel(cardLayout)点击JButton,然后转到新卡,但我得到空异常,因为新卡没有注册

我试着在谷歌上搜索,但找不到和示例,我试着用

.validate();
.refresh();
.repaint();
但什么都不起作用,这是可能的吗?如果有,有人知道任何例子吗

在下面的代码中,jPanelSliding1.nextSlidPanel只需移动到CardLayout中选定的JPanel。此处创建的新面板由于找不到面板而导致空错误。 谢谢:)

/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
一揽子伙伴关系;
导入组件。颜色方案;
导入组件。实用程序;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.GridLayout;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.beans.PropertyChangeSupport;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类JSlidingPanel扩展了javax.swing.JPanel实现了PropertyChangeListener{
公共PropertyChangeSupport pcs=新PropertyChangeSupport(此);
私人配色方案;
公共JSlidingPanel(){
初始化组件();
pcs.addPropertyChangeListener(本);
scheme=新的配色方案();
对象[][]对象={
{pcs,“已提供”,“BT详细信息”,scheme.green()},
{pcs,“已售出”,“BT详细信息”,scheme.pink()},
{pcs,“其他”,“BT详细信息”,scheme.purple()}
};
jPanelSliding1.add(makePanels(object));
}
私有void setupGUI(){
}
专用JPanel makePanels(对象[][]对象){
JPanel面板=新的JPanel();
panel.setLayout(新的GridLayout(0,objects.length));
对于(对象[]属性:对象){
添加(新的ObjectPanel((PropertyChangeSupport)属性[0],属性[1]。toString(),属性[2]。toString(),(颜色)属性[3]);
}
返回面板;
}
私有void newPanel(字符串str){
JPanel面板=新的JPanel();
panel.setLayout(新的BorderLayout());
panel.add(新的JButton());
jPanelSliding1.add(面板);
jPanelSliding1.refresh();
jPanelSliding1.validate();
jPanelSliding1.repaint();
验证();
重新油漆();
getTopFrame().pack();
jPanelSliding1.下一个滑动面板(10,面板);
jPanelSliding1.refresh();
}
@凌驾
公共作废属性更改(属性更改事件evt){
if(this.isVisible()==true){
//makePanels();
newPanel(evt.getPropertyName());
}
}
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
@凌驾
公开募捐{
JFrame=新JFrame();
JPanel面板=新的JPanel();
JSlidingPanel app=新的JSlidingPanel();
面板。添加(应用程序);
框架。添加(面板);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE\u ON\u CLOSE);
frame.setVisible(true);
frame.pack();
}
});
}
/**
*从构造函数中调用此方法来初始化表单。
*警告:不要修改此代码。此方法的内容始终为
*由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//                          
私有组件(){
jPanelSliding1=新应用程序。JPanelSliding();
setPreferredSize(新java.awt.Dimension(900600));
setLayout(新java.awt.BorderLayout());
setLayout(新java.awt.CardLayout());
添加(jPanelSliding1,java.awt.BorderLayout.CENTER);
}//                        
//变量声明-不修改
私有apps.JPanelSliding JPanelSliding 1;
//变量结束声明
}

如果您正在处理更改某个事件窗口的卡片,以下内容可能会有所帮助


如果您正在处理更改某个事件窗口的卡片,以下内容可能会有所帮助


我不确定这是否可行,但:

我看到的是,您正在尝试“刷新/重新绘制/验证”jPanelSliding值。相反,您应该修改的是您试图单击的面板。jPanelSliding可能会更新,但面板(在main上声明)没有实现

那么,为什么不尝试对main中声明的面板进行“验证”调用呢


你能试一下并告诉我们它是否有效吗?

我不确定这是否有效,但:

我看到的是,您正在尝试“刷新/重新绘制/验证”jPanelSliding
值。相反,您应该修改的是您试图单击的面板。jPanelSliding可能会更新,但面板(在main上声明)没有实现

那么,为什么不尝试对main中声明的面板进行“验证”调用呢


你能试一下并告诉我们它是否有效吗?

找到了我的问题的答案,出于某种原因,我必须在创建面板后命名它,否则它永远找不到。谢谢你的帮助

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

找到了我的问题的答案,出于某种原因,我必须在创建面板后命名它,否则它将永远找不到。谢谢你的帮助

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

我也在处理同样的问题
经过一些测试、重新测试和多次失败后,我的伪算法是这样的:

parentPanel:包含我们要删除的面板
childPanel:我们要切换的面板
parentPanelLayout:parentPanel的布局
editParentLayout():每次使用不同的子面板和新的parentPanelLayout构建parentPanel

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