java - 仅显示事件调度线程中最后添加到 JFrame 的 JPanel

标签 java swing swingworker event-dispatch-thread event-dispatching

我只能看到最后添加的JPanel。上一张似乎被上一张取代了。为什么是这样?这是我的代码。提前致谢。

...
class GUIController {



    BaseFrame bf = new BaseFrame(); //is a JFrame




    public void showFrame(final String frameName, final JPanel... panels){

        EventQueue.invokeLater(new Runnable() {
                public void run() {
                     try {
                            Class c;
                            Constructor ctr;
                            c = Class.forName("com.mytunes.client.views.frames." + frameName + "Frame");

                            ctr = c.getConstructor();

                            bf.removeAll();

                            bf = (BaseFrame) ctr.newInstance(); // no issue with getting the JFrame dynamically created!


                            for(JPanel panel:panels){

                                switch(i){
                                    case 1: bf.getContentPane().add(panel,BorderLayout.PAGE_START);

                                        break;

                                         case 2:
                                        bf.getContentPane().add(panel,BorderLayout.CENTER);
                                       break;

                                         case 3:
                                        bf.getContentPane().add(panel,BorderLayout.PAGE_END);
                                        break;

                                }

                            }
                            bf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                            bf.pack();
                            bf.setVisible(true);

                        } catch (InstantiationException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalAccessException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalArgumentException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InvocationTargetException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (NoSuchMethodException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (SecurityException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
                        }
           }

       });



    }


    public void showEnterCard(String frame){

        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();

        showFrame(frame, p1,p2, p3);
    }

}

class Main{
    public static void main(String args[]){
        GUIController c = new GUIController();

        c.showEnterCard("FirstFrame");
    }
}

编辑:(解决方案)

循环更改如下:

for(int i = 1; i <= panels.length; i++){
     switch(i){
        case 1: 
              bf.getContentPane().add(panels[0],BorderLayout.PAGE_START);
        break;
         ...
     }
}

最佳答案

你永远不会改变i,它始终是1,因此开关中的case 1:始终为true,并且JPanel始终为true添加到同一位置。

关于java - 仅显示事件调度线程中最后添加到 JFrame 的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691942/

相关文章:

java - 从 java 运行 python 脚本(具有 numpy 依赖项)

java - 将X509证书标签值转换为数字签名cxf wss4j中的base64二进制编码

java - Java 中的素因数分解代码有什么问题?

java - 如何做一个自定义的 JoptionPane

java - 如何从另一个 JPanel/JFrame/etc 添加 String JList 元素?

java - 您可以通过在后台运行中调用的方法使用发布吗?

Java Spring LDAP 导航到树中

java - 如何使 JFrame 居中?

java - 如何删除 MiGLayout 中组件之间的空间

java - 如何使 SwingWorker 多次启动..?