1

簿記の問題を解決するのに役立つアプリケーションを作成しています。アプリケーションには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");
            }
            }
4

2 に答える 2

2

このプログラムを、最初にプログラムの非GUIガットを作成せずに、主にNetBeansで生成されたGUIとして作成したのではないかと思います。それで、最初に私は尋ねなければなりません、あなたはあなたのプログラムロジックをあなたのGUIコードからMVC(model-view-controller)またはその多くの変形の1つに分けましたか?そうでない場合は、これが最初のビジネスになるはずです。実際、データの保存と回復は、そのGUI表現とは何の関係もないはずだからです。

問題を解決するための鍵は、優れたオブジェクト指向プログラミング設計になります。たとえば、String質問フィールド、possibleAnswersのArrayList、correctAnswerのフィールドStringなど、いくつかのフィールドを持つ非GUIQuestionクラスを作成することを検討してください。各チャプターとチャプターのコレクションに対して、これらの質問のArrayList(ArrayList)を用意することを検討してください。次に、質問とユーザーの回答を保存するための最良の方法を見つける必要があります。これは、シリアル化、XML(JAXB?)、または私の推奨事項であるデータベースを介したものである可能性があります。

これらすべてを理解した後でのみ、GUIの「モデル」となる非GUIロジックコードの周りにGUIを統合する方法について心配する必要があります。

コメントへの返信を編集
します。

申し訳ありませんが、私のプロジェクトに関する十分な情報を提供していません。NETBEANS7GUIで実行しています。netbeansのJavaプログラムはMVCだと思います。

申し訳ありません。NetBeansを使用してGUIを作成するだけの場合は、扱いにくいgod-classを作成することになります。優れたMVCを実現するには、最初からそのように設計する必要があります。繰り返しになりますが、これはGUIを作成する前にプログラムロジックを作成することを意味します。これには、上記で示したように、複数の非GUIクラスの作成が含まれます。NetBeansには「自動」MVCはありません。

私はMVCについてあまり知らないので、間違っているかもしれません。

はい、残念ながらあなたは間違っています。それについて読んでください:Model-View-Controller。これは、現在および将来の設計に役立ちます。

今のところ、保存して取得することができます。しかし、私はそれについてあなたの提案が欲しいです。質問ごとにかなりハードコーディングされています。

質問をハードコーディングしていないので、おそらく修正する必要があります。実際、質問テキストはコードの一部ではなく、データの一部である必要があります。質問をコンマ区切りのテキストファイルまたはデータベースに入れることを検討してください。

5つのコンポーネントに答えて、メモ帳に保存しようとしました。そしてそれをロードすると、私はそれらすべてのコンポーネントを埋めることができます。その動作。しかし、それはかなりハードコーディングされており、もちろん悪いプログラミングです。しかし、私にはいくつかの時間制限があるので、このロジックに似たものを提案できますか?何らかの関数またはメソッドによって、JPanelに存在するすべてのコンポーネント変数名を知ることができた場合。すべての15-20コンボボックスと同じ数のテキストボックスのように。すべての人に共通の機能を作ることができました

申し訳ありませんが、できればいいのですが、最初に設計上の問題を修正しない限り、できません。幸運を!

于 2011-06-28T21:39:38.427 に答える
2

1) It is good design to separate your data from the presentation. Are you doing this already? What I mean is you should be looking to store answers in an object outside of the jPanel class. (As 'Hovercraft Full Of Eels' suggested)

2) Consider making the data objects Serializable objects. If you're not planning on storing the data across a network or anything complicated/peculiar this should work out for you as it will facilitate save/load operations

3) Once you have your data separate from the GUI a check for changes becomes very easy. Assume that on any operation that takes you away from the page it "saves" its state. If the current state is different from the saved state then prompt the user to save (if it doesn't by default)

于 2011-06-28T21:41:38.380 に答える