java - 从 JPanel 返回信息

标签 java user-interface jframe jpanel

我有一个 JFrame,它有一个 Panel,供 JButtons 在两个 JPanels 之间导航( >注册面板确认面板)。两个JPanel通过使用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);
        }
    }
}

最佳答案

这取决于谁在传递此信息中扮演“主动”角色。 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();
        ...
    }

关于java - 从 JPanel 返回信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21354529/

相关文章:

c# - 如何限制编码的 UI 测试控件搜索

java - 用Java制作主菜单

java - 无法通过 Java 中返回 Int 数组的函数传递 Int 变量

android - 如何检查 TextView 是否存在

java - Spring Boot Autowiring 时的空指针

matlab - 错误 : 'You must call TIC without an output argument before calling TOC without an input argument.'

java - JFileChooser - 关于 "open"和 "cancel"按钮。 java

java - 使用 NetBeans 11.0 填充 Java JFrame 应用程序的速度缓慢

java - 使用 GenericRecord 在 Avro 中用数组填充嵌套记录

java - 如何将字符串数组从jsp发送到servlet类