Προς το περιεχόμενο

Java : πρόβλημα με txt αρχείο και αντικείμενα


takispap

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα και καλή χρονία,

 

έχω ένα πρόβλημα σε Java. Θέλω να διαβάσω ενα αρχείο txt το οποίο περιέχει εγγραφές από Items η κάθε εγγραφή δεν έχει το ίδιο πλήθος πεδίων (άλλου 5 , άλλου 3) τα Items είναι abstract class Item και απο κάτω έχω subclass HardDisk, motherboard, CPU. Οπότε οι αντίστοιχες υποκλάσεις έχουν τα παραπάνω πεδια (π.χ. η CPU έχει 3 field, η HardDisk 5 ...). Θέλω να περάσω τις εγγραφές σε ένα JList. Πως γίνεται αυτό ?

 

Σας ευχαριστώ εκ των προτέρων

Δημοσ.

καλό θα ήταν να βλέπαμε λίγο κώδικα

π.χ. δημιουργίας του αρχείου

την υλοποίηση των κλάσεων

 

καθώς και το αρχείο κειμένου txt

για να δούμε την δομή του.

Δημοσ.

Έχω τις παρακάτω κλάσεις :

abstract class Item {

 

private String id;

private String name;

private double price;

 

public Item(String id, String name, double price) {

this.id = id;

this.name = name;

this.price = price;

}

 

public class HardDisk extends Item {

private String brandName;

private int capacity;

private String commProtocol;

private String rpm;

 

public HardDisk(String id, String name, double price, String brandName, int capacity, String commProtocol, String rpm ) {

super(id, name, price);

this.brandName = brandName;

this.capacity = capacity;

this.commProtocol = commProtocol;

this.rpm = rpm;

}

 

}

 

public class Motherboard extends Item {

 

private String model;

private boolean feature1;

private boolean feature2;

 

public Motherboard(String id, String name, String model, boolean feature1, boolean feature2, double price) {

super(id, name, price);

this.model = model;

this.feature1 = feature1;

this.feature2 = feature2;

}

 

λείπουν τα set και get

 

και εχω το παρακάτω αρχείο text

CPHD24, HardDisk, Seagate, 300 GB, IDE, 5400 rpm, 80.45

CPHD28, HardDisk, Seagate, 350 GB, IDE, 7200 rpm, 90.35

CPHD38, HardDisk, Seagate, 400 GB, IDE, 7200 rpm, 120.45

CPHD52, HardDisk, WESTERN, 300 GB, IDE, 5400 rpm, 83.45

CPHD21, HardDisk, WESTERN, 200 GB, IDE, 5400 rpm, 63.45

CPHD18, HardDisk, WESTERN, 120 GB, IDE, 5400 rpm, 53.45

CPMB19, Motherboard, A5TR2-VM, true, true, 108.65

CPMB20, MotherBoard, AN8-32X, true, false, 87.89

CPMB50, MotherBoard, AN8-64X, false, false, 107.89

CPMB51, Motherboard, P5RD2-VM, true, true, 118.25

 

και θέλω αυτο να μπει σε ενα JList που οταν θα κλικάρω πάνω σε ενα data του Jlist να μεταφέρεται σε ενα JTable (ωστε να δημιουργείται το τιμολόγιο)

Δημοσ.

>

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile{

public ReadFile(String filename) throws IOException{

FileReader fr = new FileReader(filename);
   BufferedReader in = new BufferedReader(fr);
String  text="";
while ((text=in.readLine())!=null) {
	System.out.println (text);
	String divide[]=text.split(",");
	System.out.println("divided into "+divide.length);
	for (int i=0;i<divide.length;i++){
		System.out.println(""+(i+1)+"--->"+divide[i]);
	}
	System.out.println("-------------------------------");
}
  in.close();
} 


public static void main(String args[]) throws IOException	{
      new ReadFile("test.txt");
}
}


 

επεξήγηση κώδικα

έστω το αρχείο κειμένου test.txt με τα περιεχόμενα όπως τα περιγράφεις πιο πάνω

 

η ReadFile αναλαμβάνει να διαβάσει το αρχείο σου γραμμή γραμμή

το αποτέλεσμα βρίσκεται στην μεταβλητή text καθε φορά

αυτό πρέπει να το προσθέτεις κάθε φορά στο jlist που θες.

 

2ο σκέλος

για να μεταφερθεί στο jtable προφανώς πρέπει να αναγνωριστεί

η κλάση που έχει σαν ορίσματα αυτά που διάβασε από το αρχείο.

 

χρησιμοποιώ την split(",") και χωρίζω την εγγραφή(αποθηκευεται στην text)

στα επιμέρους πεδία βάζοντας τα σε έναν πίνακα string.(divide[])

μπορείς αν το πλήθος των πεδίων είναι μοναδικό να το ορίσεις με βάση αυτό

αλλιώς π.χ. με την χρήση του πεδίου περιγραφής π.χ. CPU

 

οτι δεν καταλαβαίνεις ή θες κάτι ακόμη πες το.

Δημοσ.

Σε ευχαριστω για την ανταπόκριση.

 

Κάτι παρόμοιο είχα κάνει πλην του κομματίου στο κώδικα με το divide το πρόβλημα μου είναι ότι εχω μια κλάση για το gui την ProjectGUI όπου δημιουργεί και το JList και άλλη μια κλάση ListΟfPrice με την μέθοδο showItemFromFile η οποία διαβάζει το αρχείο.

Η ερώτηση είναι πως θα περάσω το text , για την εφαρμογή μου line, στην κλάση ProjectGUI. Παρακάτω σου παραθέτω το κώδικα , σε ευχαριστώ...

>
public class ProjectGUI extends JFrame implements Constants {

   private Container guiContainer;
   private JToolBar toolbar = new JToolBar();
   private JButton[] button = new JButton[buttonCommand.length];

   /*
    * Item Data
    */
    
   private Pricelist ls = new Pricelist();
   private JList itemList = new JList();

   /*
    * Shopping Cart data
    */
   private MyTableModel basketData = new MyTableModel(columnNames);
   private JTable basketList = new JTable(basketData);

   /*
    * Δημιουργία ενος textfield μεγέθους 5
    */
   private JTextField sum = new JTextField(fieldLengthSum);

   public ProjectGUI() throws Exception {
       setTitle("Shopping Cart");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       guiContainer = getContentPane();
       /************************/
       initLists();
       /***********************/
       createToolbar();
       createMenu();
       guiContainer.setLayout(new GridBagLayout());
       layoutGUI();

       setLocation(windowX, windowY);
       setResizable(false);

   }
 private void initLists() throws Exception{

       ls.showItemFromFile();

 }

 

και

>
public class ListΟfPrice {
   private static final String EXT_FILE = "../ApplicationESB/src/applicationesb/pricelist.txt";
public void showItemFromFile() throws Exception{

       FileReader fr = new FileReader(EXT_FILE);
       BufferedReader br = new BufferedReader(fr);
      
       try {
           
           String line = br.readLine();

           while (line != null) {
               System.out.println(line);
               String divide[] = line.split(", ");
               System.out.println("Divide into " + divide.length);
               for (int i=0; i<divide.length; i++){
                   System.out.println(" "+ (i+1)+"---->"+divide[i]);
               }
               System.out.println("---------------");
               line = br.readLine();
           }

           System.out.println();
           return;
       } catch (FileNotFoundException e) {
           System.out.println("Unable to find the file: " + EXT_FILE);
       } catch (IOException e) {
           System.out.println("Error encountered reading the file: " + EXT_FILE);
       } finally {
           if (br != null) {
           }
           try {
               br.close();
           } catch (IOException e) {
               System.out.println("Error on closing: " + EXT_FILE);
           }
       }
   }

Δημοσ.
Υπάρχει η ObjectOutputputStream καθώς και η αντιστοιχή input. καλες αν και χρειάζεται πατεντα για να δουλεψει σε randomaccess

 

Την έχω δει και αυτη αλλα απο διάφορα συγγράματα που έχω μελετήσει χρειάζεται να κάνω την Item serializable και να μετατρέψω το text.txt αρχείο σε text.ser ή κάνω λάθος?

Δημοσ.

παρατήρηση-διορθωση

====================

αντί

int capacity κάνε το String capacity επειδή θέλεις και μονάδες

π.χ. 200 GB , 1.5 TB

αυτό στην κλάση HardDisk

 

εγώ θα το έκανα έτσι

 

επέλεξε μία γραμμή από το JList και μετά πάτα το button να δεις τα μηνύματα που

σου εμφανίζει.

 

>
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class List1 extends JFrame{

abstract class Item {

private String id;
private String name;
private double price;

public Item(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
class HardDisk extends Item {
private String brandName;
private String capacity;
private String commProtocol;
private String rpm;

public HardDisk(String id, String name, double price, String brandName, String capacity, String commProtocol, String rpm ) {
	super(id, name, price);
	this.brandName = brandName;
	this.capacity = capacity;
	this.commProtocol = commProtocol;
	this.rpm = rpm;
}
}

class Motherboard extends Item {

private String model;
private boolean feature1;
private boolean feature2;

public Motherboard(String id, String name, String model, boolean feature1, boolean feature2, double price) {
super(id, name, price);
this.model = model;
this.feature1 = feature1;
this.feature2 = feature2;
}
}
  
   private static final String EXT_FILE = "test.txt";//"../ApplicationESB/src/applicationesb/pricelist.txt";
   private JList listItems;
   private JButton btnCheckClass;
   private DefaultListModel listModel;
   private Item classItem;
   
   public List1() throws java.lang.Exception{
   	listModel = new DefaultListModel();
   	showItemFromFile();
   	listItems = new JList(listModel);
   	setLayout(new FlowLayout());
   	btnCheckClass=new JButton("what class is the selected text?");
   	btnCheckClass.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){
   		String line = (String) listItems.getSelectedValue();
   		classItem=returnClassFromString(line);
   		if (classItem instanceof HardDisk) System.out.println("the object selected is HardDisk");
   		if (classItem instanceof Motherboard) System.out.println("the object selected is MotherBoard");
   	}});
   	    	add(listItems);
   	add(btnCheckClass);
   	setSize(500,300);
   	setDefaultCloseOperation(EXIT_ON_CLOSE);
   	setVisible(true);
   }
   	private Item returnClassFromString(String line){
   		System.out.println("text="+line);
           String divide[] = line.split(", ");
           int posaPedia=divide.length;
           if (posaPedia>4){
           	if (divide[1].equalsIgnoreCase("motherboard")){
           		//class is motherboard;
//public Motherboard(String id, String name, String model, boolean feature1, boolean feature2, double price)
//CPMB50, MotherBoard, AN8-64X, false, false, 107.89
  double price=Double.valueOf(divide[5]);
  boolean feature1=false,feature2=false;
  if (divide[3].trim().equalsIgnoreCase("true")) feature1=true;
  if (divide[4].trim().equalsIgnoreCase("true")) feature2=true;
 Motherboard mthb=new Motherboard(divide[0],divide[1],divide[2],feature1,feature2,price);
   return mthb;           			
           	}
           	if (divide[1].equalsIgnoreCase("cpu")){
           		//class is cpu;
           		//omoios gia ta ipoloipa
           	}
           	if (divide[1].equalsIgnoreCase("harddisk")){
           		            		//class is harddisk;
         //public HardDisk(String id, String name, double price, String brandName, String capacity, String commProtocol, String rpm ) 
 //CPHD24, HardDisk, Seagate, 300 GB, IDE, 5400 rpm, 80.45
 double price=Double.valueOf(divide[6]);
 HardDisk hdd=new HardDisk(divide[0],divide[1],price,divide[2],divide[3],divide[4],divide[5]);
   return hdd;
           	}
           }

return null;
   	}

public void showItemFromFile() throws Exception,java.lang.Exception{
       FileReader fr = new FileReader(EXT_FILE);
       BufferedReader br = new BufferedReader(fr);
      
       try {
           String line = br.readLine();
           while (line != null) {
           	listModel.addElement(line);
               line = br.readLine();
           }
            
           return;
       } catch (FileNotFoundException e) {
           System.out.println("Unable to find the file: " + EXT_FILE);
       } catch (IOException e) {
           System.out.println("Error encountered reading the file: " + EXT_FILE);
       } finally {
           if (br != null) {
           }
           try {
               br.close();
           } catch (IOException e) {
               System.out.println("Error on closing: " + EXT_FILE);
           }
       }
   }
   public static void main(String args[]) throws java.lang.Exception{
   	new List1();
   }
}

 

to divide[1] είναι που καθορίζει τον τύπο της κλάσης που διαβάζουμε από το αρχείο

π.χ. HardDisk ,Motherboard k.a.

Δημοσ.

Καλημέρα,

 

Έχω άλλη μια απορία γιατι όταν επιλέγω με το mouse μια εγγραφή μου την εμφανίζει δυο φορές και όταν χρησιμοποιώ τα βελάκια απο το πληκτρολόγιο ως μήνυμα μου βγάζει μια επιλογή.

 

σας παραθέτω παρακάτω τις αντίστοιχες μεθόδους

 

> private Item returnClassFromString(String values) {
       System.out.println("text=" + values);
       String divide[] = values.split(", ");
       int numOfFields = divide.length;
       if (numOfFields > 3) {
           if (divide[1].equalsIgnoreCase("motherboard")) {
               //class is motherboard;
               //public Motherboard(String id, String name, String model, boolean feature1, boolean feature2, double price)
               //CPMB50, MotherBoard, AN8-64X, false, false, 107.89
               double price = Double.valueOf(divide[5]);
               boolean feature1 = false, feature2 = false;
               if (divide[3].trim().equalsIgnoreCase("true")) {
                   feature1 = true;
               }
               if (divide[4].trim().equalsIgnoreCase("true")) {
                   feature2 = true;
               }
               Motherboard mthb = new Motherboard(divide[0], divide[1], divide[2], feature1, feature2, price);
               return mthb;
           }
           if (divide[1].equalsIgnoreCase("keyboard")) {
               //class is keyboard;
               //public Keyboard(String id, String name, String feature, double price)
               //CPKB19, Keyboard, Enhanced, 22.45
               double price = Double.valueOf(divide[3]);
               Keyboard keybrd = new Keyboard(divide[0], divide[1], divide[2], price);
               return keybrd;
           }
           if (divide[1].equalsIgnoreCase("harddisk")) {
               //class is harddisk;
               //public HardDisk(String id, String name, double price, String brandName, String capacity, String commProtocol, String rpm )
               //CPHD24, HardDisk, Seagate, 300 GB, IDE, 5400 rpm, 80.45
               double price = Double.valueOf(divide[6]);
               HardDisk hdd = new HardDisk(divide[0], divide[1], price, divide[2], divide[3], divide[4], divide[5]);
               return hdd;
           }
           if (divide[1].equalsIgnoreCase("computer system")) {
               //class is Complex System;
               //public ComplexItem(String id, String name, String model,  boolean monitor, double price )
               //CACC23, Computer System, Anesis and Comfort, with monitor, 1250.12
               double price = Double.valueOf(divide[4]);
               boolean monitor = false;
               if (divide[3].trim().equalsIgnoreCase("with monitor")) {
                   monitor = true;
               }
               ComplexItem cmplxItem = new ComplexItem(divide[0], divide[1], divide[2], monitor, price);
               basketData.addRow(createRowData(cmplxItem));
               
               return cmplxItem;
           }

       }
       return null;
   }

   private class ListListener implements ListSelectionListener {

       public void valueChanged(ListSelectionEvent event) {
           String values = (String) listItems.getSelectedValue();
           Item classItem = returnClassFromString(values);
           if (classItem instanceof HardDisk) {

               System.out.println("The object selected is HardDisk ");
              

           }
           if (classItem instanceof Motherboard) {
               System.out.println("The object selected is Motherboard ");
           }
           if (classItem instanceof Keyboard) {
               System.out.println("The object selected is Keyboard ");
           }
           if (classItem instanceof ComplexItem) {
             
               System.out.println("The object selected is ComplexItem ");
           }
           System.out.print("-------------------------------------");

       }
   }

Δημοσ.

απλά κάνε το έτσι

 

>
.....

   public List1() throws java.lang.Exception{
   	listModel = new DefaultListModel();
   	showItemFromFile();
   	listItems = new JList(listModel);
   	listItems.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent evt) {
                      if (evt.getValueIsAdjusting()) return;
                      String values = (String) listItems.getSelectedValue();

       System.out.println(values);
     }
   });
.......

Δημοσ.

Στο πίνακα που έχω δημιουργήσει έχω και ένα πεδίο quantity το οποίο θέλω κάθε φορά που επιλέγω από το JList ένα ίδιο προϊόν να αυξάνει κατά ένα.

 

Πριν την δημιουργία του createRow έχω βάλει να αποθηκεύει ένα νέο Item στο shoppingBasket

 

if (divide[1].equalsIgnoreCase("computer system")) {

//class is Complex System;

//public ComplexItem(String id, String name, String model, boolean monitor, double price )

//CACC23, Computer System, Anesis and Comfort, with monitor, 1250.12

double price = Double.valueOf(divide[4]);

boolean monitor = false;

if (divide[3].trim().equalsIgnoreCase("with monitor")) {

monitor = true;

}

ComplexItem cmplxItem = new ComplexItem(divide[0], divide[1], divide[2], monitor, price);

sb.addItem(cmplxItem);

basketData.addRow(createRowData(cmplxItem));

return cmplxItem;

}

 

Στην κλάση shoppingBasket (sb) έχω δημιουργήσει μια μέθοδο addItem όπου ελέγχω με το itemId εάν το έχω επιλέξει ξανά και να μου κάνει add το Item

 

> public void addItem(Item newItem) {
       //See if there's already an item like this in the  basket

       boolean currIndex = items.isEmpty();
       if (currIndex) {
           //If the item is new, add it to the cart
           items.add(newItem);
       } else {
           Boolean itemExists = false;
           for (Iterator it = items.iterator(); it.hasNext() {
               Object o = it.next();
               Item shopItem = (Item) o;
               if ((shopItem.getId()).equals(newItem.getId())) {
                   //update
                   shopItem.update(newItem.getId(), newItem.getQty(), newItem.getPrice());
                   itemExists = true;
               }
           }
           if (!itemExists) {
               items.add(newItem);
           }
       }
   }

και μέσα στο Item αυτές τις μεθόδους

> public void update(String id, int qty, double price) {
       setId(id);
       setQty(qty);
       setPrice(price);
   }
public void setQty(int qty) {
      
       qty++;
       this.qty = qty;
     
   }

Με System.out.println μου βγάζει ότι αυξάνει κατά ένα αλλά με νέο κλικ στην JList αρχικοποιεί την τιμή = 0...

Επίσης η Item είναι superClass

 

έχει κανείς καμμία ιδέα΄;);)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...