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

如何从另一个面板更改卡布局面板?,第1张

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

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

public void swapView(Stringkey)
,它允许外部类交换卡…类似这样:

// pre correctedimport 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();         }      });   }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存