2011-06-28 67 views
1

我正在創建一個幫助解決會計賬簿問題的應用程序。該應用程序有12章。所有章節都包含15-20個問題。問題顯示在一個包含各種組合框和格式化文本框的JPanel中。假設我解決了一半的問題,並希望保存下一次我可以加載這一半解決問題。如何在java netbeans中保存包含組合框和文本框的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"); 
      } 
      } 
+0

它被稱爲數據持久性。在這種情況下,你可能會使用簡單的序列化技術。 – mre

回答

2

1)將數據與演示文稿分開是很好的設計。你已經這樣做了嗎?我的意思是你應該將查詢存儲在jPanel類以外的對象中。 (如'氣墊船全鰻'建議)

2)考慮使數據對象Serializable爲對象。如果你不打算通過網絡存儲數據或任何複雜/奇怪的事情,這應該爲你工作,因爲這將有助於保存/加載操作

3)一旦你有你的數據與GUI分開檢查變化變得非常容易。假設在任何讓你遠離頁面的操作上,它「保存」它的狀態。如果當前狀態與保存狀態不同,則提示用戶保存(如果它不是默認設置)

+0

偉大的思想家都認爲一樣。 1+ –

+0

謝謝你的寶貴意見,但我不熟悉序列化。我做了一件我想分享的東西。請給出你的建議。 對於每個問題,我有單獨的保存和打開功能 我將所有組件和值的名稱保存在記事本文件中,然後從中檢索值。我能夠保存和檢索,但不是他們的任何其他簡單的方式,以便它可以是所有問題的共同點 – Gaurav

+0

我試圖回答5個組件並將其保存在記事本中。並加載它,我能夠得到所有這些組件填充。它的工作。但它很難編碼,當然是糟糕的編程。但我有一些時間限制,所以你可以提出類似於這種邏輯的任何事情。 如果通過某些函數或方法我可以知道我的JPanel中存在的所有組件變量名稱。像所有的15-20組合框和相同的文本框沒有。我可以做一個可以爲所有人共同的功能。 – Gaurav

2

我想知道,如果你已經創造了這個節目主要是由於NetBeans生成的GUI不首先創建程序的非GUI膽量。所以首先,我必須問,你是否已經從GUI代碼中分出了你的程序邏輯?一個MVC(模型 - 視圖 - 控制器)還是其中一個變體?如果不是,那麼這應該是您的第一個業務秩序,因爲事實上,數據的保存和恢復應該與它的GUI表示無關。

解決您的問題的關鍵將是良好的面向對象的編程設計。考慮創建一個非GUI Question類,該類有幾個字段,包括String問題字段,PossibleAnswers的ArrayList和correctAnswer的字段字符串。考慮爲每個章節和這些章節收集這些問題的ArrayList(ArrayList)。然後,您需要找出保存問題和用戶答案的​​最佳方法。這可能是通過序列化,XML(JAXB?)或我的推薦:數據庫。

只有在你想出了所有這些之後,纔會擔心如何在GUI的「模型」的非GUI邏輯代碼周圍集成GUI。

編輯
回覆到您的評論:

對不起,我還沒有提供我的項目的足夠的信息。我在做NETBEANS 7 GUI.I猜netbeans java程序是MVC

對不起,沒有。如果你只是用NetBeans創建一個GUI,你將會創建一個笨拙的god-class。要有良好的MVC,你必須從一開始就設計它。同樣,這意味着創建您的程序邏輯之前創建GUI,在您的情況包括創建多個非GUI類,如上所述。 NetBeans中沒有「自動」MVC。

我可能是錯的,因爲我不太瞭解MVC。

是的,不幸的是你錯了。請閱讀它:Model-View-Controller。這將有助於您瞭解當前和未來的設計。

截至目前我能夠保存和檢索。但我想要你的建議。每個問題都相當硬編碼。

而且這應該可以解決,因爲你不會硬編碼的問題。事實上,問題文本甚至不應該是代碼的一部分,而應該是數據的一部分。考慮在逗號分隔的文本文件或數據庫中存在問題。

我試着回答5個組件並將它保存在記事本中。並加載它,我能夠得到所有這些組件填充。它的工作。但它很難編碼,當然是糟糕的編程。但我有一些時間限制,所以你可以提出類似於這種邏輯的任何事情。如果通過一些函數或方法,我可以知道我的JPanel中存在的所有組件變量名稱。像所有的15-20組合框和相同的文本框沒有。我可以做一個可以共同使用的功能

對不起,我希望我可以,但我不能,除非你先解決你的設計問題。祝你好運!

+0

抱歉,我還沒有提供足夠的信息,我的項目。我在做NETBEANS 7 GUI。我猜netbeans的java程序是MVC。模型取決於設計。通過爲每項工作編寫函數來查看我們如何看待和控制。我可能錯了,因爲我對MVC知之甚少。 截至目前我能夠保存和檢索。但我想要你的建議。每個問題都相當硬編碼。 我將所有組件和值的名稱保存在記事本文件中,然後從中檢索值。我能夠保存和檢索,但不是他們的任何其他簡單的方法,以便它可以是所有問題的共同點 – Gaurav

+0

我試圖回答5個組件並將其保存在記事本中。並加載它,我能夠得到所有這些組件填充。它的工作。但它很難編碼,當然是糟糕的編程。但我有一些時間限制,所以你可以提出類似於這種邏輯的任何事情。如果通過一些函數或方法,我可以知道我的JPanel中存在的所有組件變量名稱。像所有的15-20組合框和相同的文本框沒有。我可以製作一個可以共用的功能 – Gaurav

+0

@ user815576:請參閱編輯我的答案。 –

相關問題