【问题标题】:Returning information back from a JPanel从 JPanel 返回信息
【发布时间】:2014-01-25 18:29:42
【问题描述】:

我有一个JFrame,其中有一个Panel 用于JButtons 在两个JPanels(RegistrationPanel 和ConfirmationPanel)之间导航。两个JPanels通过CardPanel/CardLayout相互切换。当用户在RegistrationPanel 中输入信息时,有没有办法将此信息返回到下面列出的StartFrame?

import java.awt.BorderLayout;

public class StartFrame extends JFrame implements ActionListener
{
    JButton nextButton = new JButton("Next");
    JButton previousButton = new JButton("Previous");
    JButton registerButton = new JButton("Register");
    JPanel cardPanel = new JPanel();
    CardLayout cardLayout = new CardLayout(10, 10);

    public StartFrame()
    {
        setLayout(new BorderLayout(5, 5));
        nextButton.addActionListener(this);
        previousButton.addActionListener(this);
        previousButton.setVisible(false);
        registerButton.addActionListener(this);
        registerButton.setVisible(false);

        Panel buttonsPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
        buttonsPanel.add(previousButton);
        buttonsPanel.add(nextButton);
        buttonsPanel.add(registerButton);

        setCardLayout();
        add(BorderLayout.SOUTH, buttonsPanel);
        add(BorderLayout.CENTER, cardPanel);
    }

    private void setCardLayout()
    {       
        cardPanel.setLayout(cardLayout);
        cardPanel.add(new RegistrationPanel(), "registration");
        cardPanel.add(new ConfirmationPanel(), "confirmation");
        cardLayout.show(cardPanel, "registration");
    }

    @Override
    public void actionPerformed(ActionEvent event)
    {
        if (event.getSource().equals(nextButton))
        {
            cardLayout.next(cardPanel);
            previousButton.setVisible(true);
            registerButton.setVisible(true);
            nextButton.setVisible(false);
        }

        else
        {
            cardLayout.previous(cardPanel);
            previousButton.setVisible(false);
            registerButton.setVisible(false);
            nextButton.setVisible(true);
        }
    }
}

【问题讨论】:

    标签: java user-interface jframe jpanel


    【解决方案1】:

    这取决于谁在传递此信息时具有“积极”作用。 RegistrationPanel 是否应该将信息传递回 StartFrame(例如,当单击 RegsitrationPanel 上的按钮时?)或者 StartFrame 是否应该从 RegistrationPanel 获取信息(例如,当 StartFrame 上的按钮被点击)?

    在第一种情况下,RegistrationPanel 需要对 StartFrame 的引用(最好采用更“抽象”的形式,以避免对这个具体类的依赖)。在第二种情况下,StartFrame 需要对 RegistrationPanel 的引用。

    在这里粗略地勾勒出这些方法:

    对于第一种情况:

    class RegistrationPanel 
    {
        private StartFrame startFrame;
        public RegistrationPanel(StartFrame startFrame) 
        {
            this.startFrame = startFrame;
        }
    
        // Called e.g. when a button was clicked on this panel
        void passBackInformationToStartFrame() 
        {
            startFrame.setInfo(this.getInfo());
        }
    }
    
    
    class StartFrame ...
    {
        ...
        private void setCardLayout() 
        {       
            cardPanel.setLayout(cardLayout);
    
            // Remove: 
            //cardPanel.add(new RegistrationPanel(), "registration");
    
            // Add: 
            cardPanel.add(new RegistrationPanel(this), "registration");
    
            ....
        }
    }
    

    对于第二种情况

    public class StartFrame extends JFrame implements ActionListener
    {
        ...
        private RegistrationPanel registrationPanel
    
        private void setCardLayout()
        {       
            cardPanel.setLayout(cardLayout);
    
            // Remove: 
            //cardPanel.add(new RegistrationPanel(), "registration");
    
            // Add:
            registrationPanel = new RegistrationPanel();
            cardPanel.add(registrationPanel, "registration");
        }
    
        // Called e.g. when a button is clicked on this frame:
        void fetchInformationFromRegistrationPanel()
        {
            Info info = registrationPanel.getInfo();
            ...
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2023-03-28
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多