如何在java netbeans中保存包含组合框和文本框的jpanel?

时间:2011-06-28 21:36:12

标签: java oop jpanel netbeans-7 jsr296

我正在创建一个帮助解决会计帐簿问题的应用程序。该应用程序有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 个答案:

答案 0 :(得分:2)

我不得不怀疑你是否已经创建了这个程序,主要是作为一个NetBeans生成的GUI,而没有先创建程序的非GUI内核。首先我要问一下,您是否已将您的程序逻辑从您的GUI代码中分离出MVC(模型 - 视图 - 控制器)或其众多变体之一?如果没有那么这应该是您的第一个业务订单,因为实际上数据的保存和恢复应该与其GUI表示无关。

解决问题的关键是良好的面向对象编程设计。例如,考虑创建一个非GUI Question类,它有几个字段,包括String问题字段,possibleAnswers的ArrayList和correctAnswer的字段String。考虑为每个章节和章节的集合提供这些问题的ArrayList(ArrayList)。然后,您需要找出保存问题和用户答案的​​最佳方法。这可能是通过序列化,XML(JAXB?)或我的推荐:数据库。

只有在你弄清楚所有这一切之后,你才会担心如何围绕非GUI逻辑代码集成GUI,这将是GUI的“模型”。

修改
回复你的意见:

  

抱歉,我没有提供足够的项目信息。我在NETBEANS 7 GUI中这样做。我猜netbeans java程序是MVC

抱歉,没有。如果您只是使用NetBeans创建GUI,那么您将创建一个笨重的god-class。要拥有良好的MVC,您必须从头开始设计它。同样,这意味着在创建GUI之前创建程序逻辑,在您的情况下包括创建多个非GUI类,如上所述。 NetBeans中没有“自动”MVC。

  

我可能错了,因为我对MVC一无所知。

是的,不幸的是你错了。请阅读:Model-View-Controller。这将有助于您当前和未来的设计。

  

截至目前,我可以保存和检索。但我想要你的建议。对于每个问题,它都是非常难以编码的。

这应该是固定的,因为你不会对问题进行硬编码。事实上,问题文本甚至不应该是代码的一部分,而是数据的一部分。考虑在逗号分隔的文本文件或数据库中提出问题。

  

我试图回答5个组件并将其保存在记事本中。在加载它时,我能够填充所有这些组件。它的工作。但它的编码非常难,当然是糟糕的编程。但我有一些时间限制,所以你能提出类似于这个逻辑的建议。如果通过某种功能或方法,我可以知道我的JPanel中存在的所有组件变量名称。像所有15-20组合框和相同的文本框一样。我可以创建一个对所有人来说都很常见的功能

抱歉,我希望我能,但我不能,除非你先解决你的设计问题。祝你好运!

答案 1 :(得分:2)

1)将数据与演示文稿分开是一种很好的设计。你这样做了吗?我的意思是你应该寻找将答案存储在jPanel类之外的对象中。 (正如'Hovercraft Full Of Eels'所建议的那样)

2)考虑制作数据对象Serializable对象。如果您不打算通过网络存储数据或任何复杂/特殊的数据,这应该适合您,因为它将有助于保存/加载操作

3)将数据与GUI分开后,检查更改变得非常容易。假设在任何将您带离页面的操作中,它“保存”其状态。如果当前状态与保存状态不同,则提示用户保存(如果不是默认情况下)