GUI - 如何在保存用户输入的同时在面板或框架之间切换

时间:2014-03-12 23:54:12

标签: java swing user-interface layout

所以我有一个用按钮,文本字段和标签制作的布局。用户应该将输入放入文本字​​段中。当他点击一个按钮时,我想要它以便输入被清除并且一个新的"页面"显示我已经制作的布局。用户可以在新的"页面中输入尽可能多的信息。正如他所希望的那样,直到他击中一个"完成"按钮。简而言之,我想在面板或框架之间切换(我不知道哪个,可能是面板?)。现在,我正在考虑使用卡片布局来实现这一点,但是由于我正在阅读用户输入,因为基于预定数量的面板以及面板中的内容进行了卡片布局,所以它并不真正有意义。由于我不知道用户何时完成",我不知道要使用多少个面板。

无论如何,我只是一个GUI的初学者,所以任何帮助都会很棒!

2 个答案:

答案 0 :(得分:2)

  

现在,我正在考虑使用卡片布局来做到这一点,但是因为我   读取用户输入,因为cardlayout是真的没有意义   根据预定数量的面板制作而成的面板   面板。由于我不知道用户什么时候“完成”,我不会知道   要使用多少个面板。

您可以在下一个按钮的点击中将组件添加到CardLayout。如果所有页面具有相同的结构,则可以为这些页面创建一个类,并在每次按下下一个按钮时添加一个新类。按下完成按钮后,对所有那些遍历面板(使用CardLayout)组件的页面执行某些操作。看看Container.getComponents()方法。你甚至不需要保留任何类型的数组也不需要列表,因为容器已经这样做了。

实施例

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Demo {

    private void createAndShowGUI() {

        final JPanel cardPanel = new JPanel(new CardLayout());        
        cardPanel.add(new Page(), "1");

        final JButton nextButton = new JButton("Next");
        nextButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cardPanel.add(new Page(), String.valueOf(cardPanel.getComponentCount() + 1));
                CardLayout layout = (CardLayout)cardPanel.getLayout();
                layout.next(cardPanel);
            }
        });

        final JButton finishButton = new JButton("Finish");
        finishButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nextButton.setEnabled(false);
                for(Component comp : cardPanel.getComponents()) {
                    if(comp instanceof Page) {
                        Page page = (Page)comp;
                        page.printData();
                    }
                }
            }
        });

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(nextButton);
        buttonsPanel.add(finishButton);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(cardPanel, BorderLayout.CENTER);
        frame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    class Page extends JPanel {

        final private JTextField data;

        public Page() {
            super();
            add(new JLabel("Please add some info:"));
            data = new JTextField(20);
            add(data);
        }

        public void printData() {
            System.out.println(data.getText());
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }
}

答案 1 :(得分:0)

据我所知,您不需要多个面板。我假设您的模型层有某种对象层次结构。因此,我们假设您使用这些输入值来创建AnObject个对象。

您可以在头等舱中创建ArrayList<AnObject>。当用户输入和点击完成后,您只需再创建一个带有给定输入的AnObject,并将其添加到您在顶级类中定义的ArrayList。

顺便说一句,你也可以定义ArrayList,只要它可以访问。但是你必须仔细考虑,以保持数据的持久性。如果您定义ArrayList的类的对象是&#34;已经消失了#34;,那么您的数据也会消失。#34;。我认为这应该足够清楚了。

下一步只是简单地清除那些输入字段。

这是最简单的方法,根据您的使用情况,它可能不是最明智的方法。但它会让你知道要看什么和学习什么。