2

我正在摇摆中申请。我有20多个jpanel。我想显示我想显示的那个 jpanel:

例子:

WelcomePanel welcomePanel = new WelcomePanel();
BindingDetailsPanel bindingDetailsPanel = new BindingDetailsPanel();
FooterMainPanel footerMainPanel = new FooterMainPanel();
KeyMessageSetupPanel keyMessageSetupPanel = new KeyMessageSetupPanel();
SMSCSetupPanel sMSCSetupPanel = new SMSCSetupPanel();
LiveProcessorDetailsPanel runTimePanel = new LiveProcessorDetailsPanel();
RuntTimeInformationPanel welcomePanel=new RuntTimeInformationPanel();
BlockedSmscDetailsPanel blockedSmscDetailsPanel = new BlockedSmscDetailsPanel();

我在我的主 jFrame 中制作上面列出的面板的对象。它工作正常

因为

public mainFrame(){
    requestResponseReportPanel.setVisible(false);
    keyMessageSetupPanel.setVisible(false);
    sMSCSetupPanel.setVisible(false);
    welcomePanel.setVisible(true);
    keyMessageDetailsPanel.setVisible(false);
    blockedSmscDetailsPanel.setVisible(false);
    runTimePanel.setVisible(false);
}

当我的应用程序第一次启动时,它只会显示一个我正在显示的面板欢迎面板,welcomePanel.setVisible(true); 如果我点击它应该显示菜单,keyMessageSetupPanel 下面是显示此面板的代码:

private void keyMessageSetupMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                                        
    try {
        mainFrameContentPanel.add(keyMessageSetupPanel, BorderLayout.CENTER);
        keyMessageSetupPanel.setVisible(true);
        sMSCSetupPanel.setVisible(false);
        welcomePanel.setVisible(false);
        homeButton.setVisible(true);
        bindingDetailsPanel.setVisible(false);
        requestResponseReportPanel.setVisible(false);
        keyMessageDetailsPanel.setVisible(false);
        blockedSmscDetailsPanel.setVisible(false);
    } catch (Exception e) {
      printStackTrace();
    }
}   

我的问题是,如果我这样使用我的应用程序是否正常工作。但它会在运行时加载所有面板,并且需要很长时间才能加载。如果我不喜欢它会显示,并且如果我通过单击 (或)welcomePanel转到另一个面板:menubutton

示例

  1. 欢迎面板显示
  2. 我去了keyMessageSetupPanel(这工作正常)
  3. 现在我去了bindingDetailsPanel(它有效)
  4. 但问题是我想再次keyMessageSetupPanel(它不隐藏bindingDetailsPanel)。

已编辑这是显示的代码bindingDetailsPanel

mainFrameContentPanel.add(bindingDetailsPanel, BorderLayout.CENTER);
bindingDetailsPanel.setVisible(true);
keyMessageSetupPanel.setVisible(false);
sMSCSetupPanel.setVisible(false);
welcomePanel.setVisible(false);
homeButton.setVisible(true);
requestResponseReportPanel.setVisible(false);
keyMessageDetailsPanel.setVisible(false);
blockedSmscDetailsPanel.setVisible(false);

请帮我。 注意如果您不理解您不理解我的问题的评论,我将尝试解释。

谢谢

4

1 回答 1

3

您的代码不起作用的基本原因是您没有在进行交换后调用revalidate()repaint()在保存交换 JPanel 的容器上。这些调用告诉布局管理器重新布局所持有的组件,并告诉重新绘制管理器重新绘制容器及其子项。

话虽如此,在容器中交换可见组件的更好方法是使用为此明确构建的 CardLayout。

例如,请看这里:https ://stackoverflow.com/a/6176115/522444

对于上述程序的另一个示例,这次有一些更好的关注点分离:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

class MainClass implements ReceiveAction {
   private JPanel mainPanel = new JPanel();
   private JMenuBar menuBar = new JMenuBar();
   private JMenu chooseViewMenu = new JMenu("Choose View");

   public MainClass() {
      Registration registration = new Registration();
      ButtonPanel buttonPanel = new ButtonPanel();

      ReceiveAction[] recActions = {this, buttonPanel};
      new ViewSwapControl(registration, recActions);

      buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));
      registration.setBorder(BorderFactory.createTitledBorder("Registration Panel"));

      mainPanel.setLayout(new BorderLayout());
      mainPanel.add(registration, BorderLayout.CENTER);
      mainPanel.add(buttonPanel, BorderLayout.SOUTH);

      menuBar.add(chooseViewMenu);
   }

   public JComponent getMainPanel() {
      return mainPanel;
   }

   public JMenuBar getMenuBar() {
      return menuBar ;
   }

   @Override
   public void addAction(Action action) {
      chooseViewMenu.add(new JMenuItem(action));
   }

   private static void createAndShowUI() {
      MainClass mainInstance = new MainClass();


      JFrame frame = new JFrame("Registration");
      frame.getContentPane().add(mainInstance.getMainPanel());
      frame.setJMenuBar(mainInstance.getMenuBar());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }

}

class ViewSwapControl {
   private Registration registration;
   private List<Action> actionList = new ArrayList<>(); 

   public ViewSwapControl(Registration registration, ReceiveAction... recActions) {
      this.registration = registration;
      for (final String keyText : Registration.KEY_TEXTS) {
         actionList.add(new MyAction(keyText));
      }
      for (ReceiveAction receiveAction : recActions) {
         for (Action action : actionList) {
            receiveAction.addAction(action);
         }
      }
   }

   @SuppressWarnings("serial")
   private class MyAction extends AbstractAction {
      public MyAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         if (registration != null) {
            registration.swapView(getValue(NAME).toString());
         }
      }
   }

}

interface ReceiveAction {
   public void addAction(Action action);
}

@SuppressWarnings("serial")
class ButtonPanel extends JPanel implements ReceiveAction {

   public ButtonPanel() {
      setLayout(new GridLayout(1, 0, 10, 0));
   }

   @Override
   public void addAction(Action action) {
      add(new JButton(action));
   }
}

@SuppressWarnings("serial")
class Registration extends JPanel {
   // use these same constants as button texts later
   private static final Dimension PREF_SIZE = new Dimension(450, 300);
   public static final String USER_AGREEMENT = "User Agreement";
   public static final String USER_INFO = "User Information";
   public static final String ENROLLMENT = "Enrollment";
   // we'll extract them from this array
   public static final String[] KEY_TEXTS = {USER_AGREEMENT, USER_INFO, ENROLLMENT};
   private CardLayout cardlayout = new CardLayout();
   private JPanel cards = new JPanel(cardlayout);

   public Registration() {
      cards.add(createUserAgreePanel(), USER_AGREEMENT);
      cards.add(createUserInfoPanel(), USER_INFO);
      cards.add(createEnrollmentPanel(), ENROLLMENT);
      setLayout(new BorderLayout());
      add(cards, BorderLayout.CENTER);
   }

   @Override
   public Dimension getPreferredSize() {
      return PREF_SIZE;
   }

   private JPanel createEnrollmentPanel() {
      JPanel enrol = new JPanel();
      enrol.add(new JLabel("Enrollment"));
      return enrol;
   }

   private JPanel createUserAgreePanel() {
      JPanel userAgree = new JPanel();
      userAgree.add(new JLabel("User Agreement"));
      return userAgree;
   }

   private JPanel createUserInfoPanel() {
      JPanel userInfo = new JPanel();
      userInfo.add(new JLabel("User Information"));
      return userInfo;
   }

   public void swapView(String key) {
      cardlayout.show(cards, key);
   }

}
于 2013-08-18T13:29:20.830 回答