有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

不管怎样,我只是一个GUI初学者,所以任何帮助都将是伟大的


共 (1) 个答案

  1. # 1 楼答案

    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。如果所有页面都具有相同的结构,则可以为这些页面创建一个类,并在每次按下“下一步”按钮时添加一个新类。当按下finish(完成)按钮时,对所有在面板上迭代的页面(使用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();
                }
            });
        }
    }