如何在 cardLayout 的面板之间传输数据

How to transfer data between panels of cardLayout

在我的软件中,我使用卡片布局来创建一个 "wizard-based" 界面。在面板中,用户选择一个文件,在另一个面板中获取有关上一个面板中所选文件的信息。

问题是 CardLayout 一起加载所有面板。所以面板处理预定义的数据。但我想用当前面板中提供的信息更新下一个面板。 每个面板都有 'next' 和 'back' 按钮,所以我认为这是下一个面板可以以某种方式更新的地方。我想使用 setters 和 getters 方法,但无法正确实现。

这是一个包含两个子面板的示例代码: 基地 CLASS:

   public Base(){
            frame.setLayout(bl);
            frame.setSize(800, 600);
            frame.add(new MainPanel(), BorderLayout.CENTER);

            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
        public static void main(String[] args) {
            // TODO code application logic here
            new Base();
        }
    }

MainPanel(子面板支架)

class MainPanel extends JPanel{
    private CardLayout cl = new CardLayout();
    private JPanel panelHolder = new JPanel(cl);

    public MainPanel() {
        ChooseFile chooseFile = new ChooseFile(this);
        ShowResult showResult = new ShowResult(this);

        panelHolder.add(showResult, "showResult");
        panelHolder.add(chooseFile, "chooseFile");

        cl.show(panelHolder, "chooseFile");
        add(panelHolder);
    }
    public void showPanel(String panelIdentifier){
        cl.show(panelHolder, panelIdentifier);
    }
}

子小组 1:

class ChooseFile extends JPanel{
    MainPanel ob2;
    JPanel directoryChooserPanel, bottomPanel;
    JButton btn, localSourceBack, localSourceNext;
    JTextField field;
    public ChooseFile(MainPanel mainPanel){
        this.ob2 = mainPanel;
        ShowResult showResult = new ShowResult();
        setLayout(new BorderLayout());

        directoryChooserPanel = new JPanel(new GridLayout(0,2));
        btn = new JButton("Browse");
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                JFileChooser chooser = new JFileChooser("D:\Desktop");
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int returnVal = chooser.showOpenDialog(null);
                if(returnVal == JFileChooser.APPROVE_OPTION){
                    File myFile = chooser.getSelectedFile();
                    String text = myFile + "";

                    field.setText(text); 
                }
            }
        });


        directoryChooserPanel.add(btn);

        field = new JTextField(20);
        directoryChooserPanel.add(field);



        localSourceNext = new JButton("Next");
        localSourceNext.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                ob2.showPanel("showResult");
                showResult.setRoot(getPath());
            }
        });

        add(directoryChooserPanel, BorderLayout.NORTH);
        add(localSourceNext, BorderLayout.EAST);
    }
    public String getPath(){
        return field.getText();
    }
}

子面板 2:

class ShowResult extends JPanel{
    MainPanel ob2;
    JPanel bottomPanel, labelsPanel;
    JButton srcLocalBTN, srcFtpBTN, sourceLocationBack;
    JLabel result;
    File directory;
    String root;
    ArrayList<String> myFiles = new ArrayList<String>();
    public ShowResult(MainPanel mainPanel){
        this.ob2 = mainPanel;
        setLayout(new BorderLayout());
        result = new JLabel();
        root = "No ADDRESS";
        directory = new File(root);

        listFiles(directory, myFiles);
        String filesNumber = "It contains " + myFiles.size() + " files.";
        result.setText(filesNumber);

        add(result, BorderLayout.NORTH);
    }

    public void listFiles(File directory, ArrayList<String> list){
            for(File file : directory.listFiles()){
                list.add(file.getName());
                if(file.isDirectory()){
                    listFiles(file.getAbsoluteFile(), list);
                }
            }
    }
    public ShowResult(){

    }
    public void setRoot(String chosenPath){
        root = chosenPath;
    }
}

所以它首先加载 'sub panel 1' 所以用户通过 jFileChooser 选择一个目录,然后我需要将这些数据传输到 'sub panel 2'。所以它可以计算它包含多少文件。 我试图通过获取所选目录并分配给第二个变量中的变量来传输数据。但是没用。

有什么想法吗?

您正在创建多个 ShowResult 对象,显示一个然后将信息传递给另一个,即未显示的对象,但这不是 Java 的工作方式(这很容易通过简单地发现在此页面中搜索 new ShowResult() 个匹配项的数量)。您需要确保显示的 ShowResult 对象与您将信息传递给的对象完全相同,这意味着您必须通过构造函数或方法将显示对象的引用传递到您的 ChooseFile class参数.

更好的选择:使用 MVC 设计模式,让您的控件更改模型的状态,并让您的视图显示模型的状态。这可能会降低代码的圈复杂度。