当前位置: 首页 > 面试题库 >

如何从另一个面板更改卡布局面板?

岳茂
2023-03-14
问题内容

我用Google搜索了很多东西,但没有找到解决方案。我认为应该有Java大师来帮助我…

这是我的初始化方法:

private void initialize() {
    this.setSize(750, 480);
    this.setContentPane(getJContentPane());
    this.setTitle("Registration");
    JPanel topPane = new TopPane();
    this.getContentPane().add(topPane,BorderLayout.PAGE_START);
    cards=new JPanel(new CardLayout());
    cards.add(step0(),"step0");
    cards.add(step1(),"step1");
    cards.add(step2(),"step2");
    this.getContentPane().add(cards,BorderLayout.CENTER);
}

public JPanel step2(){
    EnumMap<DPFPFingerIndex,DPFPTemplate> template = new EnumMap<DPFPFingerIndex, DPFPTemplate>(DPFPFingerIndex.class); 
    JPanel enrol = new Enrollment(template,2);
    return enrol;
}

public JPanel step0(){
    JPanel userAgree = new UserAgreement();
    return userAgree;
}

public JPanel step1(){
    JPanel userInfo = new UserInformation();
    return userInfo;
}

public JPanel getCards(){
    return cards;
}

这是JPanel另一个步骤0的方法:

jButtonAgree.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                Registration reg = new Registration();
                LayoutManager cards = reg.getCards().getLayout();
                ((CardLayout) cards).show(reg.getCards(),"step1");
            }
        });

完全没有任何回应,我尝试过重新验证,重新粉刷和其他工作人员…不起作用…任何人在这里都可以得到意见!


问题答案:

这就是将正确的方法和常量String暴露给外界,以允许类交换视图本身。例如,给您的第一堂课一个私有的CardLayout字段,称为cardlayout,一个私有的JPanel字段称为cards(持卡人JPanel),以及一些用于将您的Card
JPanels添加到cards容器的公共String常量。还给它一个公共方法,比如所谓的public void swapView(String key),它允许外部类交换卡…类似这样:

// code corrected
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public 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);
   }

}

然后,外部类可以简单地通过在此类的可视化实例上调用swapView来交换视图,并传入适当的键String(例如,在本例中为CardTest.USER_INFO)以显示用户信息JPanel。

现在,您在这段代码中遇到了问题,我在注释中指出:

    jButtonAgree.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
            Registration reg = new Registration(); // **** HERE *****
            LayoutManager cards = reg.getCards().getLayout();
            ((CardLayout) cards).show(reg.getCards(),"step1");
        }
    });

在这一行上,您正在创建一个新的Registration对象,该对象可能与在GUI上可视化的对象完全不相关,因此,对该新对象的调用方法对当前查看的gui绝对没有影响。相反,您可能需要获取对已查看的Registration对象的引用,这可能是通过给此类提供一个getRegistration方法,然后调用其方法,如下所示:

class OutsideClass {
   private Registration registration;
   private JButton jButtonAgree = new JButton("Agree");

   public OutsideClass() {
      jButtonAgree.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            // make sure registration reference has been obtained first!
            if (registration != null) { 
               registration.swapView(Registration.USER_AGREEMENT);
            }
         }
      });
   }

   // here I allow the calling class to pass a reference to the visualized
   // Registration instance.
   public void setRegistration(Registration registration) {
      this.registration = registration;
   }
}

例如:

@SuppressWarnings("serial")
class ButtonPanel extends JPanel {
   private Registration registration;

   public ButtonPanel() {
      setLayout(new GridLayout(1, 0, 10, 0));
      // go through String array making buttons
      for (final String keyText : Registration.KEY_TEXTS) {
         JButton btn = new JButton(keyText);
         btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               if (registration != null) {
                  registration.swapView(keyText);
               }
            }
         });
         add(btn);
      }
   }

   public void setRegistration(Registration registration) {
      this.registration = registration;
   }
}

和驱动这一切的MainClass

class MainClass extends JPanel {
   public MainClass() {
      Registration registration = new Registration();
      ButtonPanel buttonPanel = new ButtonPanel();
      buttonPanel.setRegistration(registration);

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

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

   private static void createAndShowUI() {
      JFrame frame = new JFrame("Registration");
      frame.getContentPane().add(new MainClass());
      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();
         }
      });
   }
}


 类似资料:
  • 在我的程序中,我有一个基于向导的布局。由CardLayout实现。因此,有一组类扩展了JPanel。我想在每个面板上都有按钮来导航到其他面板。例如,当程序显示第一面板时,我想有一个按钮来显示第二面板。 我试图在main cardlayout panel holder中创建一个方法,以便任何其他类都可以通过该方法更改显示面板,但它不起作用,并且出现了stackoverflow错误。 这是我的课程 基

  • 问题内容: 所以我有一个带有面板的jFrame。在该面板内部,还有两个面板,并且布局设置为卡片。在这两个面板之一中,有一个按钮。按下该按钮时,如何更改显示的面板? 问题答案: 试试这个代码片段,希望这些注释可以帮助您理解序列。

  • 问题内容: 我创建了一个框架,然后在其中创建了面板。我已经将图像放置在一个 面板中,现在我需要将该图像拖动到另一个面板中。我该怎么做。 请作为初学者逐步说明。 问题答案: 使用纯Java的快速示例DragGestureListener,DropTargetAdapter并 TransferHandler为一个面板上的图像对另一面板的DnD支持: 选择绿色形状并将其拖动到上方的空白面板后:

  • 我有什么办法可以这么做吗?

  • 主要内容:GWT 布局面板 介绍,GWT 常用的布局面板GWT 布局面板 介绍 布局面板可以包含其他小部件。这些面板控制小部件在用户界面上的显示方式。每个 Panel 小部件都从 Panel 类继承属性,后者又从 Widget 类继承属性,而后者又从 UIObject 类继承属性。 小组件 描述 GWT UIObject类 此小部件包含文本,不会使用 <div> 元素将其解释为 HTML,从而使其以块布局显示。 GWT Widget类 此小部件可以包含

  • 我正在一个名为Dashboard的类中创建一个标签疼痛,它在标签中包含“填充”面板。我想知道是否有办法创建一个新的仪表板并更改我存储在选项卡中的面板。我不确定这是否是正确的解释方法,但这里有一些代码。 我现在想创建一个新类来创建和实例仪表板,但更改选项卡中显示的面板。我尝试了这样的操作: 我不确定这是否可能,或者是否有另一种方法可以做到这一点。