2011-05-30 199 views
11

我谷歌搜索了很多,并没有找到解决办法。我认为应该是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; 
} 


这是另一个step0的JPanel中的方法:

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

根本没有反应,我试过重新验证,重绘和其他工作人员...不工作...任何人都有任何的饮料在这里!

+1

这是一个不正确的注册实例调用方法的问题。在上面的代码中,您正在创建一个与GUI中显示的完全无关的新注册实例。相反,您需要获取对可见注册对象的引用。请参阅下面的答案... – 2011-05-30 12:18:43

回答

19

这一切都暴露了正确的方法和常量字符串到外面的世界,让全班同学交换意见本身。例如,给你的第一个班级一个名为cardlayout的私人CardLayout字段和一个名为卡片(卡片持有者JPanel)的私人JPanel字段,以及一些用于将卡片JPanels添加到卡片容器的公共字符串常量。也给它的公共方法,说叫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简单地交换意见,传入适当的键字符串(例如在此情况下为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"); 
     } 
    }); 

您要创建一个新的登记对象,行,可能一个是完全无关的一个是在GUI上可视化,所以调用这个新对象的方法对当前查看的gui没有任何影响。你需要,而不是去观看的登记对象的引用,也许通过放弃此一等级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(); 
     } 
     }); 
    } 
} 
+0

这非常有帮助!非常感谢 !这个问题已经怀疑我已经很多天了......哈哈... – 2011-05-30 12:52:10

+1

@aladdin:我的儿子的关键是正确的*参考文献*。一旦你明白了,剩下的就很容易。很高兴帮助。 – 2011-05-30 13:01:40

+0

我希望可以给这个帖子更多的分数 – Zavior 2012-03-28 22:38:19