2013-03-23 83 views
0

我已經通過論壇進行搜索,但不斷提出解決方案。如何在GUI程序運行之前閱讀文本文件

我正在製作一種GUI程序庫。我想要的是它通過文本文件保存條目。我可以使用我已有的方法創建對象,並可以將它們輕鬆保存到文件中。問題來自於再次啓動程序並在文本文件中填充一個帶有值的Vector。我添加的對象有一個String值,接着是7個布爾值。當我嘗試從文件加載時,字符串值爲空(「」),所有布爾值都爲false。

如何在啓動GUI的其餘部分並填充向量之前閱讀文本?

編輯:對於這一切非常模糊,抱歉。我會發布代碼,但它大約有337行。

import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.Collections; 
import java.util.Scanner; 
import java.util.Vector; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

@SuppressWarnings("serial") 
public class SteamLibraryGUI extends JFrame implements ActionListener 
{ 
    //For main window 
    private JButton exitButton, addEntry, editEntry, removeEntry; 
    private JLabel selectGame, gameCount; 
    private JComboBox<String> gameCombo; 
    private Vector<Game> gamesList = new Vector<Game>(); 
    private Vector<String> titleList = new Vector<String>(); 
    private int numGames = gamesList.size(); 
    private int selectedGame; 

    //For add window 
    private JFrame addFrame; 
    private JLabel gameTitle = new JLabel("Title:"); 
    private JTextField titleText = new JTextField(60); 
    private JCheckBox singleBox, coopBox, multiBox, cloudBox, controllerBox, achieveBox, pcBox; 
    private JButton addGame, addCancel; 

    //For edit window 
    private JFrame editFrame; 
    private JButton editGame, editCancel; 

    public SteamLibraryGUI() 
    { 


     setTitle("Steam Library Organizer"); 
     addEntry = new JButton("Add a game"); 
     editEntry = new JButton("Edit a game"); 
     removeEntry = new JButton("Remove a game"); 
     exitButton = new JButton("Exit"); 
     selectGame = new JLabel("Select a game:"); 
     gameCount = new JLabel("Number of games:"+numGames); 
     gameCombo = new JComboBox<String>(titleList); 

     JPanel selectPanel = new JPanel(); 
     selectPanel.setLayout(new GridLayout(1,2)); 
     selectPanel.add(selectGame); 
     selectPanel.add(gameCombo); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(1,3)); 
     buttonPanel.add(addEntry); 
     buttonPanel.add(editEntry); 
     buttonPanel.add(removeEntry); 

     JPanel exitPanel = new JPanel(); 
     exitPanel.setLayout(new GridLayout(1,2)); 
     exitPanel.add(gameCount); 
     exitPanel.add(exitButton); 

     Container pane = getContentPane(); 
     pane.setLayout(new GridLayout(3,1)); 
     pane.add(selectPanel); 
     pane.add(buttonPanel); 
     pane.add(exitPanel); 

     addEntry.addActionListener(this); 
     editEntry.addActionListener(this); 
     removeEntry.addActionListener(this); 
     exitButton.addActionListener(this); 
     gameCombo.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource()==addEntry) 
      addEntry(); 
     if(e.getSource()==editEntry) 
      editEntry(gamesList.get(selectedGame)); 
     if(e.getSource()==removeEntry) 
     { 
      removeEntry(selectedGame); 
      update(); 
     } 
     if(e.getSource()==exitButton) 
      exitProg(); 
     if(e.getSource()==gameCombo) 
      { 
       selectedGame = gameCombo.getSelectedIndex(); 
      } 
     if(e.getSource()==singleBox) 
      singleBox.isSelected(); 
     if(e.getSource()==coopBox) 
      coopBox.isSelected(); 
     if(e.getSource()==multiBox) 
      multiBox.isSelected(); 
     if(e.getSource()==cloudBox) 
      cloudBox.isSelected(); 
     if(e.getSource()==controllerBox) 
      controllerBox.isSelected(); 
     if(e.getSource()==achieveBox) 
      achieveBox.isSelected(); 
     if(e.getSource()==pcBox) 
      pcBox.isSelected(); 
     if(e.getSource()==addGame) 
     { 
      gamesList.add(new Game(titleText.getText(), singleBox.isSelected(), coopBox.isSelected(), 
        multiBox.isSelected(), cloudBox.isSelected(), controllerBox.isSelected(), 
        achieveBox.isSelected(), pcBox.isSelected())); 
      titleList.add(titleText.getText()); 
      addFrame.dispose(); 
      update(); 
     } 
     if(e.getSource()==addCancel) 
      addFrame.dispose(); 
     if(e.getSource()==editCancel) 
      editFrame.dispose(); 
     if(e.getSource()==editGame) 
     { 
      gamesList.get(selectedGame).name = titleText.getText(); 
      gamesList.get(selectedGame).single = singleBox.isSelected(); 
      gamesList.get(selectedGame).coop = coopBox.isSelected(); 
      gamesList.get(selectedGame).multi = multiBox.isSelected(); 
      gamesList.get(selectedGame).cloud = cloudBox.isSelected(); 
      gamesList.get(selectedGame).controller = controllerBox.isSelected(); 
      gamesList.get(selectedGame).achieve = achieveBox.isSelected(); 
      gamesList.get(selectedGame).pc = pcBox.isSelected(); 
      titleList.remove(selectedGame); 
      titleList.add(titleText.getText()); 
      editFrame.dispose(); 
      update(); 
     } 
    } 

    public void update() 
    { 
     Collections.sort(titleList); 
     Collections.sort(gamesList); 
     gameCombo.updateUI(); 
     titleText.setText(""); 
     gameCombo.setSelectedIndex(-1); 
     numGames = gamesList.size(); 
     gameCount.setText("Number of games:"+numGames); 
    } 

    public void addEntry() 
    { 
     addFrame = new JFrame("Add Entry"); 
     addFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addFrame.getContentPane(); 
     addFrame.setLayout(new GridLayout(3,1)); 

     singleBox = new JCheckBox("Single-Player"); 
     singleBox.setSelected(false); 
     coopBox = new JCheckBox("Coop"); 
     coopBox.setSelected(false); 
     multiBox = new JCheckBox("MultiPlayer"); 
     multiBox.setSelected(false); 
     cloudBox = new JCheckBox("Steam Cloud"); 
     cloudBox.setSelected(false); 
     controllerBox = new JCheckBox("Controller Support"); 
     controllerBox.setSelected(false); 
     achieveBox = new JCheckBox("Achievements"); 
     achieveBox.setSelected(false); 
     pcBox = new JCheckBox("For New PC"); 
     pcBox.setSelected(false); 
     addGame = new JButton("Add game"); 
     addCancel = new JButton("Cancel"); 

     JPanel titlePanel = new JPanel(); 
     titlePanel.setLayout(new FlowLayout()); 
     titlePanel.add(gameTitle); 
     titlePanel.add(titleText); 

     JPanel checkPanel = new JPanel(); 
     checkPanel.setLayout(new FlowLayout()); 
     checkPanel.add(singleBox); 
     checkPanel.add(coopBox); 
     checkPanel.add(multiBox); 
     checkPanel.add(cloudBox); 
     checkPanel.add(controllerBox); 
     checkPanel.add(achieveBox); 
     checkPanel.add(pcBox); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout()); 
     buttonPanel.add(addGame); 
     buttonPanel.add(addCancel); 

     addFrame.add(titlePanel); 
     addFrame.add(checkPanel); 
     addFrame.add(buttonPanel); 

     singleBox.addActionListener(this); 
     coopBox.addActionListener(this); 
     multiBox.addActionListener(this); 
     cloudBox.addActionListener(this); 
     controllerBox.addActionListener(this); 
     achieveBox.addActionListener(this); 
     pcBox.addActionListener(this); 
     addGame.addActionListener(this); 
     addCancel.addActionListener(this); 

     addFrame.pack(); 
     addFrame.setVisible(true); 
    } 

    public void editEntry(Game g) 
    { 
     editFrame = new JFrame("Edit Entry"); 
     editFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     editFrame.getContentPane(); 
     editFrame.setLayout(new GridLayout(3,1)); 

     singleBox = new JCheckBox("Single-Player"); 
     singleBox.setSelected(g.single); 
     coopBox = new JCheckBox("Coop"); 
     coopBox.setSelected(g.coop); 
     multiBox = new JCheckBox("MultiPlayer"); 
     multiBox.setSelected(g.multi); 
     cloudBox = new JCheckBox("Steam Cloud"); 
     cloudBox.setSelected(g.cloud); 
     controllerBox = new JCheckBox("Controller Support"); 
     controllerBox.setSelected(g.controller); 
     achieveBox = new JCheckBox("Achievements"); 
     achieveBox.setSelected(g.achieve); 
     pcBox = new JCheckBox("For New PC"); 
     pcBox.setSelected(g.pc); 
     editGame = new JButton("Edit game"); 
     editCancel = new JButton("Cancel"); 
     titleText.setText(g.name); 

     JPanel titlePanel = new JPanel(); 
     titlePanel.setLayout(new FlowLayout()); 
     titlePanel.add(gameTitle); 
     titlePanel.add(titleText); 

     JPanel checkPanel = new JPanel(); 
     checkPanel.setLayout(new FlowLayout()); 
     checkPanel.add(singleBox); 
     checkPanel.add(coopBox); 
     checkPanel.add(multiBox); 
     checkPanel.add(cloudBox); 
     checkPanel.add(controllerBox); 
     checkPanel.add(achieveBox); 
     checkPanel.add(pcBox); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout()); 
     buttonPanel.add(editGame); 
     buttonPanel.add(editCancel); 

     editFrame.add(titlePanel); 
     editFrame.add(checkPanel); 
     editFrame.add(buttonPanel); 

     singleBox.addActionListener(this); 
     coopBox.addActionListener(this); 
     multiBox.addActionListener(this); 
     cloudBox.addActionListener(this); 
     controllerBox.addActionListener(this); 
     achieveBox.addActionListener(this); 
     pcBox.addActionListener(this); 
     editGame.addActionListener(this); 
     editCancel.addActionListener(this); 

     editFrame.pack(); 
     editFrame.setVisible(true); 
    } 

    public void removeEntry(int g) 
    { 
     Object[] options = {"Yes, remove the game", "No, keep the game"}; 

     int n = JOptionPane.showOptionDialog(null, "Are you sure you want to remove this game from the list?", 
       "Remove game?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]); 
     if (n==0) 
     { 
      gamesList.remove(g); 
      titleList.remove(g); 
     } 
    } 

    public void exitProg() 
    { 
     try 
     { 
      PrintWriter out = new PrintWriter("games.txt"); 
      out.flush(); 
      for(int i=0;i<gamesList.size();i++) 
      { 

       out.print(gamesList.get(i).toString()); 
      } 
      out.close(); 
     } 
     catch (FileNotFoundException e) {} 
     System.exit(0); 
    } 

    public static void main(String[] args) 
    { 
     SteamLibraryGUI frame = new SteamLibraryGUI(); 
     frame.pack(); 
     frame.setSize(600,200); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Scanner in = new Scanner("games.txt"); 
     while(in.hasNextLine()) 
     { 
      String line = in.nextLine(); 
      String[] options = line.split("|"); 
      Game g = new Game(options[0],Boolean.getBoolean(options[1]), 
        Boolean.getBoolean(options[2]),Boolean.getBoolean(options[3]), 
        Boolean.getBoolean(options[4]),Boolean.getBoolean(options[5]), 
        Boolean.getBoolean(options[6]),Boolean.getBoolean(options[7])); 
      frame.gamesList.add(g); 
      frame.titleList.add(options[0]); 
      System.out.println(g.toString()); 
     } 
     in.close(); 
    } 
} 

還有一個遊戲類,但它只是1個字符串,然後是7個布爾值。

+2

在您的'main'方法中,只需調用讀取文件的方法,然後再創建GUI對象... – jlordo 2013-03-23 23:21:54

+0

文件的格式是什麼?你如何將其內容分配給對象變量?你使用序列化? – 2013-03-23 23:24:23

+0

我已經嘗試在創建GUI之前放置方法,但由於某種原因它仍然不起作用。 – JStGermain 2013-03-23 23:26:14

回答

0

代碼中有兩個重要的錯誤。首先,Scanner使用字符串參數構建(這意味着掃描程序掃描字符串,而不是字符串命名的文件)。其次,管道字符「|」是一個正則表達式元字符。這很重要,因爲line.split()在正則表達式上分割。因此,「|」必須逃脫。如果是寫如下的main()功能工作正常(與調試輸出代碼包含表明,每一步都正常工作):

public static void main(String[] args) 
{ 
    SteamLibraryGUI frame = new SteamLibraryGUI(); 
    frame.pack(); 
    frame.setSize(600,200); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    try 
    { 
     Scanner in = new Scanner(new File("games.txt")); 
     while(in.hasNextLine()) 
     { 
      System.out.println("line = "); 
      String line = in.nextLine(); 
      System.out.println(line); 
      String[] options = line.split("\\|"); 
      System.out.println("Options = "); 
      for (String s : options) 
      { 
       System.out.println(s); 
      } 
      Game g = new Game(options[0],Boolean.getBoolean(options[1]), 
       Boolean.getBoolean(options[2]),Boolean.getBoolean(options[3]), 
       Boolean.getBoolean(options[4]),Boolean.getBoolean(options[5]), 
       Boolean.getBoolean(options[6]),Boolean.getBoolean(options[7])); 
      frame.gamesList.add(g); 
      frame.titleList.add(options[0]); 
      System.out.println(g.toString()); 
     } 
     in.close(); 
    } catch (IOException x) 
    { 
     System.err.println(x); 
    } 
} 

還有另一個重要的疑難雜症:該方法exitProg()寫入「games.txt 「在節目結束前再次提出。如果首先錯誤地讀取文件,則會產生問題,因爲將錯誤的數據寫回文件。在測試過程中,這意味着即使讀取代碼已被更正,仍會讀取以前測試運行中寫入的錯誤數據。

我在這種情況下的首選是隔離Game類中的「game.txt」的所有讀寫代碼(這樣可以更容易地驗證讀寫格式是否相同),並只寫入一旦我編寫並測試了閱讀代碼,就可以將數據寫回去,這樣可以避免這種情況。