2016-12-03 2 views
0

割り当ての一部として、配列のオブジェクトをフラットファイルに保存して、特定の基準が満たされたときにそれらを取得する必要がありました。私はオブジェクトをうまく保存することができますが、それらを取得する際には複数の値を取得することに問題があり、何がうまくいかないのか理解していますが、解決策を見つけるのに苦労しています。ここに何が起こっているの概念です。配列のオブジェクトをCSVファイルに格納し、GUIの特定の引数で読み取る

ボタン番号10、A(コードのR1S10)がテストボタンです。クリックすると、以下に示すイベントが作成されます。ボタン10A用

This is my system, its a ticket booking system Clickイベント - When 10A is first pressed
アウトカム - -

When booking is complete

、ボタンをもう一度押す -

下の画面が続く

private void R1S10ActionPerformed(java.awt.event.ActionEvent evt) {          

    seats.add(seat1); 


    if (R1S10.getBackground().equals(Color.red) &&(IsSeatBooked().equals("true"))){ 
     Component frame = null; 
     JOptionPane.showMessageDialog(frame, "Seat UnBooked"); 
     seat1.setBooked("false"); 
     seat1.setName(""); 
     R1S10.setBackground(Color.yellow); 
     try { 
       reader(); 
      writer(); 

      //String booked = "true"; 
      //Pass String booked into csv file 
     } catch (IOException ex) { 
      Logger.getLogger(SeatingPlan.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
    else{ 
     Component frame = null; 
     String name = JOptionPane.showInputDialog(frame, "Please enter name of Customer booking"); 
     if (name.isEmpty()) { 
      JOptionPane.showMessageDialog(frame, "No value entered"); 

     } else if (name != null) { 
      seat1.setName(name); 
      seat1.setBooked("true"); 
      R1S10.setBackground(Color.red); 
      JOptionPane.showMessageDialog(frame, "Your Booking has been placed"); 
      try { 
       writer(); 
       reader(); 
       //String booked = "true"; 
       //Pass String booked into csv file 
      } catch (IOException ex) { 
       Logger.getLogger(SeatingPlan.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

}  

UnBooked

このSeatingPlan.java - writer()、reader()、およびIsSeatBooked()では、3つのメソッドを使用しています。

SeatingPlan -

public class SeatingPlan extends javax.swing.JFrame { 

/** 
* Creates new form SeatingPlan 
*/ 
String seatNo, name, bookedSeat; 
FileWriter fileWriter = null; 
List<Seat> seats = new ArrayList<Seat>(); 


//Seat Object Declaration 

Seat seat1 = new Seat("R1S10","","false"); 
Seat seat2 = new Seat("R1S9", "", "false"); 
String fileName = "seat.csv"; 

作家 -

public void writer() throws IOException { 
    //Delimiter used in CSV file 
    final String NEW_LINE_SEPARATOR = "\n", COMMA_DELIMITER = ","; 

    //CSV file header 
    final String FILE_HEADER = "seatID,name,booked"; 

    //fileName = System.getProperty("user.home") + "/seat.csv"; 
    try { 
     fileWriter = new FileWriter(fileName); 

     //Write the CSV file header 
     fileWriter.append(FILE_HEADER.toString()); 

     //Add a new line separator after the header 
     fileWriter.append(NEW_LINE_SEPARATOR); 

     //Write a new student object list to the CSV file 
     for (Seat seat : seats) { 
      fileWriter.append(String.valueOf(seat.getSeatID())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(seat.getName()); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(seat.isBooked()); 
      fileWriter.append(NEW_LINE_SEPARATOR); 
     } 

     System.out.println("CSV file was created successfully !!!"); 

    } catch (Exception e) { 
     System.out.println("Error in CsvFileWriter !!!"); 
     e.printStackTrace(); 
    } finally { 

     fileWriter.flush(); 
     fileWriter.close(); 

    } 
} 

リーダー -

public void reader() { 
    //Delimiter used in CSV file 
    final String COMMA_DELIMITER = ","; 
    //Student attributes index 
    final int SEAT_ID_IDX = 0; 
    final int SEAT_NAME_IDX = 1; 
    final int SEAT_BOOKED = 2; 
    //private static final int STUDENT_LNAME_IDX = 2; 
    BufferedReader fileReader = null; 

    try { 

     //Create a new list of student to be filled by CSV file data 
     List<Seat> seats = new ArrayList<>(); 

     String line = ""; 

     //Create the file reader 
     fileReader = new BufferedReader(new FileReader(fileName)); 

     //Read the CSV file header to skip it 
     fileReader.readLine(); 

     //Read the file line by line starting from the second line 
     while ((line = fileReader.readLine()) != null) { 
      //Get all tokens available in line 
      String[] tokens = line.split(COMMA_DELIMITER); 
      if (tokens.length > 0) { 
       //Create a new seat object and fill his data 
       Seat seat = new Seat(tokens[SEAT_ID_IDX],   
       tokens[SEAT_NAME_IDX], tokens[SEAT_BOOKED]); 
       seats.add(seat); 
       seatNo = tokens[SEAT_ID_IDX]; 
       //System.out.println("Seat Number: " + seatNo); 
       bookedSeat = tokens[SEAT_BOOKED]; 
       } 
     } 

     //Print the new student list 
     for (Seat seat : seats) { 
      System.out.println(seat.toString()); 
     } 
    } catch (Exception e) { 
     System.out.println("Error in CsvFileReader !!!"); 
     e.printStackTrace(); 
    } finally { 
     try { 
      fileReader.close(); 
     } catch (IOException e) { 
      System.out.println("Error while closing fileReader !!!"); 
      e.printStackTrace(); 
     } 
    } 

}//end reader 

SeatingPlan - この私が成果を制御する引数を持ってしようとしたが、IsBookedが衝突している場合ならば複数の座席が選択されているとき

public SeatingPlan() throws IOException { 
    setVisible(true); 
    initComponents(); 
    //reader(); 
    ColourSectionGold(); 
    ColourSectionBronze(); 
    reader(); 

    if(R1S10.getBackground().equals(Color.yellow) && (IsSeatBooked().equals("true"))){ R1S10.setBackground(Color.red);} 
    //if(R1S9.getBackground().equals(Color.yellow) && (IsSeatBooked().equals("true2"))){ R1S9.setBackground(Color.red);} 
    } 

IsSeatBooked -

public String IsSeatBooked(){ 
return bookedSeat; 
}//end IsSeatBooked 

イム席が予約されているかどうかを確認するために私の引数として上記の方法を使用しますが、新しいシートをクリックしたときにそれはbookedSeat "の全体の値を設定します - システムが正常に動作しなくなります。私はコードが非常に効率的ではないことを理解していますが、私が正しく説明していれば、この問題の一時的な修正があります。

また、私は座席のための私のクラスが含まれます -

public class Seat { 
private String seatID; 
private String booked; 
private String name; 
private int price; 

public Seat(String seatID,String name,String booked){ 
    this.seatID = seatID; 
    this.booked = ""; 
    this.name = name; 
    this.price = price; 
} 

public String getSeatID() { 
    return seatID; 
} 

public void setSeatID(String seatID) { 
    this.seatID = seatID; 
} 

public String isBooked() { 
    return booked; 
} 

public void setBooked(String booked) { 
    this.booked = booked; 
} 

public String getStatus(){ 
    return booked; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public void setPrice() { 
    this.price = price; 
}}//end class Seat 

そして、作成されたCSVファイルを見て -

CSV Outcome

私は1つ以上をクリックできるようにしたいですボタンを押して状態を保存すると、ボタン10は現時点で正常に動作しますが、IsBookedは一度に1つの値しか持たないため、衝突します。

これをチェックするまでに時間がかかった場合、私はそれを感謝します。建設的な批判は参考になり、どんなアイデアも素晴らしいだろう!

ありがとう、 水田。

+2

[mcve]が必要な質問があれば、これです。あなたはあなたの疑問を持って有効なMCVEを作成して投稿することができれば、まともな回答を得る可能性はかなり高いでしょう。このコードにはGUIコードはありません。むしろ、オブジェクトの状態の格納と取得にもっと関わっています。 –

+0

私は上記のコードを提供せずに私の問題を実証できるとは思わなかった。アドバイスを気に入って、そのリンクをクリックした後に馬鹿に見える。 – phppaddy

答えて

1

あなたがしていることを正確に見るためには、コードが多すぎます。

あなたのcsvファイルを使用する代わりに、Propertiesファイルを作成することができます。だからあなたの場合には鍵がIDになり

key:data 

:A1、A2 ...及びデータは、座席を予約した人の名前だろうPropertiesファイルは次の形式でデータを保存します。

したがって、ファイルは空として開始されます。 GUIを作成するときに、各IDをチェックして、項目が「プロパティー」フィールドにあるかどうかを確認するループを作成します。見つかった場合は、シートを撮影したものとして表示し、そうでない場合は空です。

座席を予約したいときは、setProperty(...)の方法を使用してください。

Propertiesクラスは、load(...)クラスとstore(...)メソッドを持っています。

したがって、Propertiesクラスを使用すると、最小限の労力でフラットファイルデータベースを簡単に管理できます。

R1S10のような変数名は決してありません。 if/elseステートメントで100個の異なる変数が必要です。代わりに、JButtonを拡張して行を渡し、パラメータとしてボタンを座らせます。次に、ボタンのActionListenerで、行/座席情報にアクセスして、プロパティファイルのキーとして使用されるIDを作成します。

編集:

は非常IDは、プロパティファイルであるかどうかを確認するループを作ることができませんでした。

プロパティがnullの場合、シースは空です。

import java.util.*; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     Properties properties = new Properties(); 
     properties.setProperty("A2", "Smith"); 
     properties.setProperty("C3", "Jones"); 

     String[] rows = { "A", "B", "C", "D" }; 
     int seats = 4; 

     for (int row = 0; row < rows.length; row++) 
     { 
      for (int seat = 1; seat <= seats; seat++) 
      { 
       String key = rows[row] + seat; 
       String property = properties.getProperty(key); 

       System.out.println(key + " : " + property); 
      } 
     } 


    } 
} 
+0

お返事ありがとうございます!私は今夜​​これを試してみるつもりです。私はそれがどのように進むのかを知らせます。 – phppaddy

+0

この答えのコンセプトを使用しました。非常に便利! IDがプロパティファイル内にあるかどうかをチェックするループを作成できませんでした。しかし、私はそれが働いた、私は後で効率について心配するでしょう!ありがとう@camickr – phppaddy

+0

@phpPaddy、編集を参照してください。 – camickr

関連する問題