Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从子类更新父类UI_Java_Swing - Fatal编程技术网

Java 从子类更新父类UI

Java 从子类更新父类UI,java,swing,Java,Swing,我有一个swing应用程序。这里是我试图做的简化视图 大型机是包含应用程序中所有组件的父框架。它有一个名为jPanel的子级 jPanel有一个名为按钮的子项。单击按钮时,我想从大型机中删除“jPanel”,并添加一个不同的面板 注意:按钮可以是jPanel的直接子级,也可以是jPanel的子级(即:jPanel>>一些其他面板>>按钮) 基本上,我需要一个广播接收器类型的功能,Android。( “注意:buttom可以是jPanel的直接子女或jPanel的子女” 不会发生。组件只能有一个

我有一个swing应用程序。这里是我试图做的简化视图

大型机是包含应用程序中所有组件的父框架。它有一个名为
jPanel
的子级

jPanel
有一个名为
按钮的子项。单击
按钮
时,我想从
大型机
中删除“jPanel”,并添加一个不同的面板

注意:按钮可以是
jPanel
的直接子级,也可以是
jPanel
的子级(即:jPanel>>一些其他面板>>按钮)

基本上,我需要一个广播接收器类型的功能,Android。(

“注意:buttom可以是jPanel的直接子女或jPanel的子女”

不会发生。组件只能有一个父容器

“jPanel有一个名为button的子级。单击按钮时,我希望从大型机中删除'jPanel'并添加其他面板。”


与添加和删除面板相比,一种更简洁的方法是使用
CardLayout
,其中面板是“分层”的,并且可以通过
CardLayout
的方法进行导航,如
show()
previous()
next()
。请参见。请参见一个简单的示例,如果您碰巧正在使用GUI Builder工具,请参见。即使您没有使用GUI Builder,我仍然会查看该链接,以了解其工作原理。

我最终完成了以下操作。虽然不是最好的,但效果很好

//get the container
Container tempContainer = MetricTablesX.this.getTopLevelAncestor();
if (tempContainer == null || tempContainer.getComponentCount() == 0) {
    return;
}

//get the root pane
Component rootPane = tempContainer.getComponent(0);
if (rootPane == null || !(rootPane instanceof JRootPane)) {
    return;
}
JRootPane pane = (JRootPane) rootPane;
if (pane == null || pane.getComponentCount() == 0) {
    return;
}

//get the layer Pane
Component jLayerPane = pane.getComponent(1);
if (jLayerPane == null || !(jLayerPane instanceof JLayeredPane)) {
    return;
}
JLayeredPane layerPane = (JLayeredPane) jLayerPane;
if (layerPane == null || layerPane.getComponentCount() == 0) {
    return;
}

//get the junk panel
Component jPanel = layerPane.getComponent(0);
if (jPanel == null || !(jPanel instanceof JPanel)) {
    return;
}
JPanel junkPanel = (JPanel) jPanel;
if (junkPanel == null || junkPanel.getComponentCount() == 0) {
    return;
}

//get the main panel
Component mPanel = junkPanel.getComponent(0);
if (mPanel == null || !(mPanel instanceof JPanel)) {
    return;
}
JPanel mainPanel = (JPanel) mPanel;
if (mainPanel == null || mainPanel.getComponentCount() == 0) {
    return;
}

//get the dashHolder
for (int i = 0; i < mainPanel.getComponentCount(); i++) {
    Component dPanel = mainPanel.getComponent(i);
    if (dPanel == null || !(dPanel instanceof JPanel)) {
        return;
    }
    JPanel dashHolderPanel = (JPanel) dPanel;
    if (dashHolderPanel.getName().equalsIgnoreCase("dashHolderPanel")) {
        RetailRegionDashboard retailRegionDash = new RetailRegionDashboard(cell.mtr);
        dashHolderPanel.removeAll();
        dashHolderPanel.add(retailRegionDash);
        dashHolderPanel.revalidate();
        dashHolderPanel.repaint();
    }
}
//获取容器
Container tempContainer=MetricTablesX.this.GetToLevel祖先();
if(tempContainer==null | | tempContainer.getComponentCount()==0){
返回;
}
//获取根窗格
组件根窗格=tempContainer.getComponent(0);
if(rootPane==null | |!(rootPane instanceof JRootPane)){
返回;
}
JRootPane=(JRootPane)根窗格;
if(pane==null | | pane.getComponentCount()==0){
返回;
}
//获取图层窗格
组件jLayerPane=pane.getComponent(1);
如果(jLayerPane==null | |!(jLayerPane实例为JLayeredPane)){
返回;
}
JLayeredPane layerPane=(JLayeredPane)jLayerPane;
if(layerPane==null | | layerPane.getComponentCount()==0){
返回;
}
//去拿垃圾板
Component jPanel=layerPane.getComponent(0);
if(jPanel==null | |!(jPanel的jPanel实例)){
返回;
}
JPanel junkPanel=(JPanel)JPanel;
if(junkPanel==null | | junkPanel.getComponentCount()==0){
返回;
}
//拿到主面板
Component mPanel=junkPanel.getComponent(0);
if(mPanel==null | |!(JPanel的mPanel实例)){
返回;
}
JPanel主面板=(JPanel)mPanel;
如果(mainPanel==null | | mainPanel.getComponentCount()==0){
返回;
}
//去拿仪表盘
对于(int i=0;i
是的,一个组件只能有一个父级。我想说的是,Jpanel有一些childJpanel,它有这个按钮。(在本例中,Jpanel不是按钮的父级,而是childJpanel)。我不认为使用CardLayout是答案。我想做的是从子组件更新父组件。通常,卡片布局用于从子组件更新父组件。“卡片布局用于从子组件更新父组件。”-不正确。试试看。让parentPanel给我们一个CardLayout,并执行按钮的操作,显示
parentPanel
的不同面板。我看不出这种逻辑有任何错误。除此之外,你的问题太模糊,需要一个最小的完整可运行示例来说明你的问题。主要问题是如何重新设置对于CardLayout,请从按钮actionPerformed()转到parentPanel?+1。
如何从按钮actionPerformed()转到parentPanel?
-您知道事件的来源是按钮,因此可以始终使用
getParent()
method。或者,您可以始终为要实现的所有面板创建一个更正式的界面,以便它们能够访问CardLayout和要显示的相应卡片。