GUI - Как переключаться между панелями или фреймами при сохранении пользовательского ввода

1

Поэтому у меня есть макет с кнопками, текстовыми полями и ярлыками. Пользователь должен помещать ввод в текстовые поля. Когда он нажимает кнопку, я хочу, чтобы вход был очищен, и новая "страница" отображается с макетом, который я сделал. Пользователь может вводить как можно больше информации на новые "страницы", пока он не нажмет кнопку "Готово". Короче говоря, я хочу переключаться между панелями или кадрами (я не знаю, какие, вероятно, панели?). Теперь я подумывал использовать макет карты для этого, но поскольку я читаю пользовательский ввод, это не имеет смысла, поскольку cardlayout создается на основе заранее определенного количества панелей и что будет в панелях. Поскольку я не буду знать, когда пользователь "закончен", я не буду знать, сколько панелей использовать.

В любом случае, я просто начинающий с графическим интерфейсом, поэтому любая помощь будет отличной!

Теги:
user-interface
layout
swing

2 ответа

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();
            }
        });
    }
}
  • 0
    Вау, спасибо! Я заметил, что метод actionPerformed был внутри параметра nextButton.addActionListener. Я не знал, что это возможно. Если вы не возражаете, не могли бы вы сказать мне, как это называется, или, возможно, дать мне ссылку, где я мог бы прочитать об этом? Очень признателен!
  • 0
    Пожалуйста. Это на самом деле анонимный внутренний класс (Google для этого). Это также иллюстрируется в этом ответе . Если этот ответ достаточно хорош для вас, не забудьте принять его: как работает принятие ответа?
Показать ещё 4 комментария
0

Насколько я понимаю из вашего описания вам не нужны несколько панелей. Я предполагаю, что у вас есть своего рода иерархия объектов для вашего модельного слоя. Итак, скажем, вы используете эти входные значения для создания объектов AnObject.

Вы можете создать ArrayList<AnObject> в своем верхнем классе. И в качестве пользовательских входов и кликов вы просто создаете еще один AnObject с заданным вводом и добавьте его в ArrayList, который вы определили в высшем классе.

Кстати, вы также можете определить ArrayList, насколько это возможно. Но вы должны тщательно подумать, чтобы ваши данные были постоянными. Если объект класса, который вы определили ArrayList, "ушел", ваши данные также "исчезли". Я думаю, что это должно быть достаточно ясно.

Следующий шаг - это просто тривиальное очищение этих полей ввода.

Это самый простой способ, возможно, это не самый умный способ сделать это в зависимости от вашего варианта использования. Но это даст вам представление о том, на что смотреть и учиться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню