readLine solange es mit einem bestimmten Zeichen anfängt

plammy

Bekanntes Mitglied
Hallo 🙂
Ich habe eine schon eine Methode die meine .txt-Datei problemlos ausliest. Danach füllt das Programm die ausgelesene Daten in den dazu bestimmten Textfelder und macht was damit.
Ich will aber aber mehrere Zeilen auslesen die ich in nur r 2 von den Textfelder einfülle.. z.B.
ich habe in der txt-Datei die Daten:

900
100
900
500
900
200
880
80
60
400
900
100
#50
*30
#70
*80

Die Zahlen ohne Zeichen davor sind für nur 1 Textfeld vorgesehen und dann ist gut.. 🙂 das klappt. So.. Ich Zahle mit Zeichen # sind für Breite und die * dir Höhe verschiedene Rechtecke die anhand diese Daten nacheinander gezeichnet werden sollen. Deswegen will ich diese Zeilen nacheinander solange auslesen und in den beide Textfelder speichern bis es die Zahlen mit Zeichen gibt.

Java:
 if (object.getSource() == open){
           
           CreateFile create=new CreateFile();
           
            JFileChooser fc = new JFileChooser();
            setContentPane(create);
            getContentPane().add(fc);
            
            fc.setFileFilter(new FileNameExtensionFilter("*.txt","txt"));
            
            int state = fc.showOpenDialog(this);
            if ( state == JFileChooser.APPROVE_OPTION ){
                File openFile = fc.getSelectedFile();  

              BufferedReader br = null;
               try {
                   
                
                String line=null;
                
                br = new BufferedReader(new FileReader(openFile));
                    while ((line = br.readLine()) != null) {
   
                        System.out.println("headerW: " + line);
                        create.headerWidth.setText(line);
                        
                        line = br.readLine(); //2.Zeile                      
                        System.out.println("headerH: " + line);
                        create.headerHeight.setText(line);
                        
                        line = br.readLine(); //3.Zeile                       
                        System.out.println("contentW: " + line);
                        create.contentWidth.setText(line);     
                        
                        line = br.readLine(); //4.Zeile                        
                        System.out.println("contentH: " + line);
                        create.contentHeight.setText(line);    
                        
                        line = br.readLine(); //5.Zeile                      
                        System.out.println("footerW: " + line);
                        create.footerWidth.setText(line);      
                        
                        line = br.readLine(); //6.Zeile                        
                        System.out.println("footerH: " + line);
                        create.footerHeight.setText(line); 
                        
                        // button CreateLayout
                        create.buttonCreateLayout.doClick();
                        create.editPanel.repaint();
                        
                        line = br.readLine(); //7.Zeile
                        System.out.println("tile1W: " + line);
                        create.tile1Width.setText(line);
                        
                        line = br.readLine(); //8.Zeile                       
                        System.out.println("tile1H: " + line);
                        create.tile1Height.setText(line);
                        
                        line = br.readLine(); //9.Zeile                        
                        System.out.println("tile2W: " + line);
                        create.tile2Width.setText(line);    
                        
                        line = br.readLine(); //10.Zeile                       
                        System.out.println("tile2H: " + line);
                        create.tile2Height.setText(line);       
                        
                        line = br.readLine(); //11.Zeile                       
                        System.out.println("tile3W: " + line);          
                        create.tile3Width.setText(line);      
                        
                        line = br.readLine(); //12.Zeile                        
                        System.out.println("tile3H: " + line);
                        create.tile3Height.setText(line);
                             
                        //button Create FixForms
                        create.buttonFixForms.doClick();
                        create.editPanel.repaint();
                        
                       /* Also HIER ist das PROBLEM 
                        * Die werden nur einmal auslesen, geschrieben und dann fägsts von vorne und 
                        * kommt natürlich zu Fehler und falsche Auslesen (siehe Ausgabe auf der 
                        * Konsole)*/

                        line = br.readLine();
                        if(line.startsWith("#")){                          
                            System.out.println("BausteinW: " + line);
                            create.bausteinWidth.setText(line.substring(1));                           
                        }
                        
                        line = br.readLine();
                        if(line.startsWith("*")){                          
                            System.out.println("BausteinH: " + line);
                            create.bausteinHeight.setText(line.substring(1));                            
                        }
                        //button Create FixForms
                        create.buttonIndividualForms.doClick();
                        create.editPanel.repaint();
                      
                    }
            
                    } catch (FileNotFoundException ex) {
                        ex.printStackTrace();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    } finally {
                        //Close the BufferedReader
                        try {
                            if (br != null)
                                br.close();
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
               
              
              }
        }

Konsole:

headerW: 900
headerH: 100
contentW: 900
contentH: 500
footerW: 900
footerH: 200
tile1W: 880
tile1H: 80
tile2W: 60
tile2H: 400
tile3W: 900
tile3H: 100
BausteinW: #50
BausteinH: *30
headerW: #70
headerH: *80
contentW: null
contentH: null
footerW: null
footerH: null

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:504)
....
at java.lang.Integer.parseInt(Integer.java:527)
 
Die einzelnen Zeilen gehören scheinbar ja irgendwie zusammen. Kannst Du das ganze nicht etwas sturkturieter (alle zusammengehörenden Daten in eine Zeile) oder evtl. sogar als xml speichern?

Gründsätzlich würde ich das readLine() am Reader ausschließlich im Kopf der while Schleife aufrufen und in der Schleife anhand des Gelesenen entscheiden was passieren soll. Alles andere ist meiner Meinung zu "gefährlich" und man müsste z.B. nach jedem readLine eine Überprüfung auf null machen.

In Deinem Fall wurde eine Leerzeile (die in der oberen Liste nicht auftaucht) gelesen und versucht in eine Zahl zu verwandeln. Das geht zwangläufig schief.

Das ganze in Textfelder zu schreiben und und ein einem Button doClick() aufzurufen scheint wohl eher ein Hack zu sein. Warum nicht "direkt" zeichnen? Das ganze scheint ja auch ein Objekt zu sein. Java ist eine objektorientierte Sprache warum nicht eine Klasse für dieses Objekt definieren und mit Objekten arbeiten?
 
aber wenn alle in einer zeile sind zb für baustein.. weis oll ich sagen nehme nacheinander erste zahl für Width zweite für ehight driite wieder für width.. das ist viel komplizierter oder nicht
 
Die Idee mit dem XML ist schon ein sehr gute Ansatz!

Falls Du die Zahlen in einer Zeile stehen hast kannst Du sie mittels StringTokenizer auseinander nehmen...
 

Zurück
Oben