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

标签 java swing user-interface layout

所以我有一个由按钮、文本字段和标签组成的布局。用户应该将输入输入到文本字段中。当他点击按钮时,我希望清除输入并显示一个新的“页面”,其中包含我所做的布局。用户可以在新的“页面”中输入任意多的信息,直到他点击“完成”按钮。简而言之,我想在面板或框架之间切换(我不知道是哪个,可能是面板?)。现在,我正在考虑使用卡片布局来执行此操作,但由于我正在读取用户输入,因此它实际上没有意义,因为卡片布局是基于预定数量的面板以及面板中的内容进行制作的。因为我不知道用户何时“完成”,所以我不知道要使用多少个面板。

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

最佳答案

Now, I was thinking of using card layout to do this but since i'm reading user input it wouldn't really make sense since cardlayout is made based on a predetermined amount of panels and what will be in the panels. Since I won't know when the user is "finished", I won't know how many panels to use.

您可以动态地将组件添加到 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();
            }
        });
    }
}

关于java - GUI - 如何在保存用户输入的同时在面板或框架之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366378/

相关文章:

Android:好看的(标准)设置菜单

java - 将 onClickListener 设置为自定义适配器

java - 将带有特殊字符的 JSON 反序列化为字符串

java - 文件名包含斜杠标点符号并在线程 "main"java.io.FileNotFoundException : foo/boo/en_en. json 中给出异常(没有这样的文件或目录)

java - JOptionPane 会降低应用程序性能吗?

java - JTable 单元格渲染器使用其他单元格背景设置背景

javascript - 蒙德里安网页布局

delphi - 在 OpenGL 渲染上下文之上叠加图形

java - 何时调用 editor.apply?

java - 以编程方式设置 JLabel 文本