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