Как сохранить Jpanel, содержащий поля со списком и текстовые поля в Java NetBeans?

Я создаю приложение, которое помогает решать проблемы бухгалтерской книги. Приложение имеет 12 глав. Все главы содержат 15-20 задач. Проблема отображается в JPanel, содержащей различные поля со списком и поля с форматированным текстом. Предположим, я решил половину проблемы и хочу сохранить ее, чтобы в следующий раз я смог загрузить эту половину решенного вопроса.

Сохранение должно быть сделано, нажав сохранить из меню. И загрузка под нагрузкой из меню

Все меню и список задач работают, но я ничего не могу спасти. Я использовал jFilechooser...

Есть ли способ сделать это?

Как сохранить панель с заполненными списками элементов и текстовыми полями. И есть ли у них какой-либо способ узнать, что пользователь внес какие-либо изменения в какие-либо элементы, чтобы при закрытии проблемы я снова мог попросить сначала сохранить ее, а затем выйти.

Заранее спасибо.

Некоторые из моих кодов:

private void openBtnMouseClicked(java.awt.event.MouseEvent evt) {
opening();
}
public void opening() {
        JFileChooser chooser=new JFileChooser();
        int choice=chooser.showOpenDialog(this);       
        javax.swing.JComboBox[] sourceALE = {aaCombo, baCombo, caCombo, daCombo, eaCombo, faCombo, gaCombo, haCombo, iaCombo, jaCombo, kaCombo,
                            alCombo, blCombo, clCombo, dlCombo, elCombo, flCombo, glCombo, hlCombo, ilCombo, jlCombo, klCombo,
                            aeCombo, beCombo, ceCombo, deCombo, eeCombo, feCombo, geCombo, heCombo, ieCombo, jeCombo, keCombo};
                            javax.swing.JTextField[] sourceP = {aeval1, beval, ceval, deval, eeval, feval, geval, heval, ieval, jeval, keval};
                           String [] comboboxes={"aaCombo", "baCombo", "caCombo", "daCombo", "eaCombo", "faCombo", "gaCombo", "haCombo", "iaCombo", "jaCombo", "kaCombo","alCombo", "blCombo", "clCombo", "dlCombo", "elCombo", "flCombo", "glCombo", "hlCombo", "ilCombo", "jlCombo","klCombo","aeCombo", "beCombo", "ceCombo", "deCombo", "eeCombo", "feCombo", "geCombo", "heCombo", "ieCombo", "jeCombo", "keCombo"};
        if(choice==JFileChooser.APPROVE_OPTION) {

            File file = chooser.getSelectedFile();
            try {
                System.out.println("Hey");
                Scanner scanner = new Scanner(new FileReader(file));
                while ( scanner.hasNextLine() ){
                    Scanner scan = new Scanner(scanner.nextLine());
                    scan.useDelimiter("=");
                    if ( scan.hasNext() ){
                        String item=scan.next();
                        int value=scan.nextInt();
                        String color=scan.next();
                        for(int g=0;g<comboboxes.length;g++){
                            if(item.equals(comboboxes[g])) {
                                if(value<3)
                                sourceALE[g].setSelectedIndex(value);
                                if(color.equals("red"))
                                sourceALE[g].setForeground(red);
                                if(color.equals("green"))
                                sourceALE[g].setForeground(green);
                                if(color.equals("blah"))
                                sourceALE[g].setForeground(blah);
                            }
                        }
                    }
                    scan.close();
                }
                scanner.close();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(q1.class.getName()).log(Level.SEVERE, null, ex);
            }
                }
                public void opening() {
        JFileChooser chooser=new JFileChooser();
        int choice=chooser.showOpenDialog(this);       
        javax.swing.JComboBox[] sourceALE = {aaCombo, baCombo, caCombo, daCombo, eaCombo, faCombo, gaCombo, haCombo, iaCombo, jaCombo, kaCombo,
                            alCombo, blCombo, clCombo, dlCombo, elCombo, flCombo, glCombo, hlCombo, ilCombo, jlCombo, klCombo,
                            aeCombo, beCombo, ceCombo, deCombo, eeCombo, feCombo, geCombo, heCombo, ieCombo, jeCombo, keCombo};
                            javax.swing.JTextField[] sourceP = {aeval1, beval, ceval, deval, eeval, feval, geval, heval, ieval, jeval, keval};
                           String [] comboboxes={"aaCombo", "baCombo", "caCombo", "daCombo", "eaCombo", "faCombo", "gaCombo", "haCombo", "iaCombo", "jaCombo", "kaCombo","alCombo", "blCombo", "clCombo", "dlCombo", "elCombo", "flCombo", "glCombo", "hlCombo", "ilCombo", "jlCombo","klCombo","aeCombo", "beCombo", "ceCombo", "deCombo", "eeCombo", "feCombo", "geCombo", "heCombo", "ieCombo", "jeCombo", "keCombo"};
        if(choice==JFileChooser.APPROVE_OPTION) {

            File file = chooser.getSelectedFile();
            try {
                System.out.println("Hey");
                Scanner scanner = new Scanner(new FileReader(file));
                while ( scanner.hasNextLine() ){
                    Scanner scan = new Scanner(scanner.nextLine());
                    scan.useDelimiter("=");
                    if ( scan.hasNext() ){
                        String item=scan.next();
                        int value=scan.nextInt();
                        String color=scan.next();
                        for(int g=0;g<comboboxes.length;g++){
                            if(item.equals(comboboxes[g])) {
                                if(value<3)
                                sourceALE[g].setSelectedIndex(value);
                                if(color.equals("red"))
                                sourceALE[g].setForeground(red);
                                if(color.equals("green"))
                                sourceALE[g].setForeground(green);
                                if(color.equals("blah"))
                                sourceALE[g].setForeground(blah);
                            }
                        }
                    }
                    scan.close();
                }
                scanner.close();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(q1.class.getName()).log(Level.SEVERE, null, ex);
            }
                }
        System.out.println("OUT");
            }
            }

2 ответа

Решение

1) Это хороший дизайн, чтобы отделить ваши данные от презентации. Вы уже делаете это? Я имею в виду, что вы должны искать ответы в объекте вне класса jPanel. (Как и предполагалось в "Hovercraft Full Of Eels")

2) Рассмотреть возможность создания объектов данных Сериализуемых объектов. Если вы не планируете хранить данные в сети или что-то сложное / особенное, это должно сработать для вас, поскольку это облегчит операции сохранения / загрузки

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

Я должен задаться вопросом, создавали ли вы эту программу в первую очередь как сгенерированный NetBeans графический интерфейс, не создавая вначале не-GUI кишки программы. Итак, сначала я должен спросить, отделили ли вы логику вашей программы от кода GUI в виде MVC (модель-представление-контроллер) или одного из его многочисленных вариантов? Если нет, то это должно быть вашим первым делом, поскольку на самом деле сохранение и восстановление данных не должны иметь ничего общего с их представлением в графическом интерфейсе.

Ключом к решению вашей проблемы будет хороший дизайн объектно-ориентированного программирования. Рассмотрим, например, создание класса вопросов, не связанных с графическим интерфейсом, который имеет несколько полей, включая поле вопроса String, ArrayList of возможных Answers и поле String для correctAnswer. Подумайте о наличии ArrayList из этих вопросов (ArrayList) для каждой главы и коллекции глав. Затем вам нужно будет найти лучший способ сохранить вопросы и ответы пользователей. Это может быть через сериализацию, XML (JAXB?) Или мою рекомендацию: база данных.

Только после того, как вы разобрались со всем этим, вы должны беспокоиться о том, как интегрировать GUI вокруг вашего логического кода без GUI, который будет "моделью" GUI.

редактировать
Ответы на ваши комментарии:

Извините, я не предоставил достаточно информации о моем проекте. Я делаю это в NETBEANS 7 GUI. Я думаю, что Java-программы NetBeans MVC

Извините, нет. Если все, что вы делаете, это создаете графический интерфейс с NetBeans, вы будете создавать громоздкий бог-класс. Чтобы иметь хороший MVC, вы должны разработать его таким образом с самого начала. Опять же, это означает создание логики вашей программы перед созданием GUI, который в вашем случае включает в себя создание нескольких классов без GUI, как я указывал выше. В NetBeans нет "автоматического" MVC.

Я могу ошибаться, так как не очень разбираюсь в MVC.

Да, к сожалению, вы не правы. Пожалуйста, прочитайте об этом: Model-View-Controller. Это поможет вам с вашим текущим и будущим дизайном.

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

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

Я попытался ответить на 5 компонентов и сохранить его в блокноте. И при загрузке я могу заполнить все эти компоненты. Работает. Но это довольно жестко и да, конечно, плохое программирование. Но у меня есть некоторые ограничения по времени, поэтому вы можете предложить что-нибудь похожее на эту логику. если бы по какой-либо функции или методу я мог знать все переменные имени компонентов, присутствующие в моей JPanel. как и все 15-20 поля со списком и то же нет текстового поля. Я мог бы сделать функцию, которая может быть общей для всех

Извините, я хотел бы, но не могу, если только вы сначала не исправите свои проблемы с дизайном. Удачи!

Другие вопросы по тегам