Как сохранить Jpanel, содержащий комбинированные поля и текстовые поля в Java NetBeans? - PullRequest
1 голос
/ 29 июня 2011

Я создаю приложение, которое помогает решать проблемы бухгалтерской книги. Приложение имеет 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 ]

2 голосов
/ 29 июня 2011

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

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

2 голосов
/ 29 июня 2011

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

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

Только после того, как вы разобрались со всем этим, вам следует задуматься о том, как интегрировать графический интерфейс в логический код, не относящийся к графическому интерфейсу, который будет «моделью» графического интерфейса.

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

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

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

Возможно, я ошибаюсь, так как мало знаю о MVC.

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

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

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

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

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

...