JFrame Componenten Problem

Status
Nicht offen für weitere Antworten.

tigerlily

Mitglied
Hallo,

ich habe irgendwie ein Verständnisproblem mit meinem JFrame und der Componente TextArea.

Und zwar baue ich mir in meinem Konstruktor mein Frame zusammen. Dort soll nur eine TextArea angezeigt werden. In meiner weiteren Methode verarbeiten soll dann jedesmal ein Text anhand der append() Methode an das TextArea übergeben werden.

Wenn ich mein Programm laufen lasse, sehe ich nur mein Frame, aber keine TextArea. Es wirkt so als ob dieses Frame eingefrohren wäre. Sieht irgendwie typisch aus wie als wenn ein Windows Programm abschmiert ;-)

Hier mal mein Code (ist gekürzt):

Java:
class dateiVerb{
	
	private static String selectedFile;
	public JTextArea dasTextfeld;
	
	public dateiVerb()
	{
		JFrame f = new JFrame();	
		f.setSize(500,500);
		dasTextfeld = new JTextArea("Die Verarbeitung wird gestartet",450,450);
		dasTextfeld.setBounds(0, 0, 450,450);
		f.add(new JScrollPane(dasTextfeld));
		f.setVisible(true);
	}

    public void verarbeiten(String selectedFile)
   {

       //Hier wird ein File in einer Schleife eingelesen und es soll nur die 
      //entsprechende Nr ausgegeben werden
	dasTextfeld.append("Bearbeitung Nr: "+Nr);
						

	}
}
}

Das ganze wird aus meiner Start.java Datei wie folgt aufgerufen:

Java:
			datei = new dateiVerb();
			datei.verarbeiten(selectedFile);

Die Verarbeitung funktioniert einwandfrei und das JFrame wird aufgerufen aber dann happerts an der TextArea:autsch:

Wo liegt mein Denkfehler?

lg

tigerlily
 
was ist denn
Code:
Nr
im Teil der Ausgabe? Das seh ich nirgends. Weiterhin rufe direkt vor dem
Code:
setVisible
mal ein
Code:
f.pack();
auf
 
An dem was du bisher gepostet hast, ist soweit erstmal nichts falsch.
Klassennanmen werden groß geschrieben!

Anosnsten muss es an deiner Funktion verarbeiten() liegen

wenn du in deinem "Testprogramm"
Code:
dasTextfeld.append("Bearbeitung Nr: " + selectedFile);
schreibst, dann geht es wunderbar.

Legst du in der Funktion einen extra Thread an?
 
Hallo,

ich lege kein extra Thread an. Die Nr wird bei mir im Code schon initialisiert. Hatte nur den Code der Übersichtlichkeitshalber verkürzt, da mein Problem darin besteht das die TextArea überhaupt nicht angezeigt wird. Wenn ich pack() oder validate() hinzufügen ändert das immer noch nichts an dem Verhalten das die TextArea nicht angezeigt wird.

???:L
 
Hallo,

ich lege kein extra Thread an. Die Nr wird bei mir im Code schon initialisiert. Hatte nur den Code der Übersichtlichkeitshalber verkürzt, da mein Problem darin besteht das die TextArea überhaupt nicht angezeigt wird. Wenn ich pack() oder validate() hinzufügen ändert das immer noch nichts an dem Verhalten das die TextArea nicht angezeigt wird.

???:L

Java:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class dateiVerb{
    
    private static String selectedFile;
    public JTextArea dasTextfeld;
    
    public dateiVerb()
    {
        JFrame f = new JFrame();    
        f.setSize(500,500);
        dasTextfeld = new JTextArea("Die Verarbeitung wird gestartet",450,450);
        dasTextfeld.setBounds(0, 0, 450,450);
        f.add(new JScrollPane(dasTextfeld));
        f.setVisible(true);
    }
 
    public void verarbeiten(String selectedFile)
   {
 
       //Hier wird ein File in einer Schleife eingelesen und es soll nur die 
      //entsprechende Nr ausgegeben werden
    dasTextfeld.append("Bearbeitung Nr: " + selectedFile);
                        
 
    }
    
    public static void main(String[] args) 
    {
    	 dateiVerb datei = new dateiVerb();
         datei.verarbeiten("Stringtoshow");
	}
}

wird ohne Probleme angezeigt
 
Hallo,

komisch komisch bei mir wird immer nur noch das Frame angezeigt und es wirkt wie eingefrohren. Wenn ich mir auf der Konsole anschaue was in selectedFile drin steht,
sehe ich genau den String aber es wird nichts im Frame angezeigt.

Java:
                //Pfad Angabe drin
		System.out.print("Bearbeitung der VersNr: "+ selectedFile);
                //Passiert rein gar nichts
		dasTextfeld.append("Bearbeitung der VersNr: "+ selectedFile);

:shock:
 
komisch komisch bei mir wird immer nur noch das Frame angezeigt und es wirkt wie eingefrohren
betrifft das auch das beispiel von Verjigorm oder immer noch dein code?

Wenn es nur bei deinem Code der Fall ist, bräuchten wir wohl mehr davon um genaueres zu sagen
 
Hi,

also der Code von Verjigorm funktioniert einwandfrei :toll:

Wenn ich meine dateiVerb.java direkt über die Main Methode aufrufe:
Java:
        dateiVerb datei = new dateiVerb();
         datei.verarbeiten("D:\\Test\\Test.TXT");

dann funktioinert es einwandfrei. Sobald ich aus meiner Start.java die verarbeiten() Funktion aufrufen möchte, dann klappt dies wieder nicht mit der TextArea:

Java:
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if(cmd.equals("Öffnen"))
		{
			Shell shell = new Shell(SWT.APPLICATION_MODAL);
			String[] filterExtensions = {"*.txt"};
			FileDialog fileDialog = new FileDialog(shell,SWT.OPEN);
			fileDialog.setText("FileDialog");
			fileDialog.setFilterPath("D:/");
			fileDialog.setFilterExtensions(filterExtensions);
			String selectedFile = fileDialog.open();
			
			dateiVerarbeiten(selectedFile);
		}
		else if(cmd.equals("Beenden"))
		{
		  setVisible(false);
		  dispose();
		  System.exit(1);
		}
		else if(cmd.equals("Starten"))
		{						
         dateiVerb datei = new dateiVerb();
         datei.verarbeiten(selectedFile);
		}
		
	}

private void dateiVerarbeiten(String selectedFile)
	{
		this.selectedFile = selectedFile;
				
		JLabel jlbem = new JLabel("Wenn \"Starten\" betätigt wird die Verarbeitung der Datei gestartet");
		jlbem.setBounds(0, 0, 500, 50);
		
		
		JLabel jl = new JLabel(selectedFile);
		jl.setBounds(0,30, 350,50);
		
		JButton buttonStart = new JButton("Starten");
		buttonStart.setBounds(370, 40, 120,30);
		buttonStart.addActionListener(this);
                add(jlbem);
		add(jl);		
		add(buttonStart);
                 this.repaint();


	}

Was ist daran anders? selectedFile ist ein String.

gruß
 
Hallo,

habe das jetzt in den FileChooser umgeändert

Java:
JFileChooser chooser = new JFileChooser("D:/Test");
			chooser.setMultiSelectionEnabled(true);
			
			chooser.addChoosableFileFilter(new FileFilter() {
				    public boolean accept(File f) {
				      if (f.isDirectory()) return true;
				      return f.getName().toLowerCase().endsWith(".txt");
				    }
				    public String getDescription () { return "txts"; }  
			  });
			
			chooser.showOpenDialog(null);
			File file = chooser.getSelectedFile(); 
			String selectedFile = file.getPath();
			
			
		   dateiVerarbeiten(selectedFile);

und was muss ich noch ändern in meiner Datei? Ansonsten ist noch alles beim alten. TextArea wird in Frame nicht angezeigt.
 
Was mir da grade auffällt:

Java:
        else if(cmd.equals("Starten"))
        {                       
         dateiVerb datei = new dateiVerb();
         datei.verarbeiten(selectedFile);
        }

ist falsch.

da sollte doch nur
Java:
dateiVerarbeiten(selectedFile);

stehen, wobei ich mir nicht sicher bin, woher dein selectedFile kommt
 
Hallo,

mein selectedFile bekomme ich übder JFileChooser.
Danach rufe ich die meine dateiVerarbeiten(selectedFile) Funktion auf:

Java:
	private void dateiVerarbeiten(String selectedFile)
	{
		this.selectedFile = selectedFile;
				
		JLabel jlbem = new JLabel("Wenn Sie den Button \"Starten\" betätigen wird die Verarbeitung der Datei gestartet");
		jlbem.setBounds(0, 0, 500, 50);
		
		
		JLabel jl = new JLabel(selectedFile);
		jl.setBounds(0,30, 350,50);
		
		JButton buttonStart = new JButton("Starten");
		buttonStart.setBounds(370, 40, 120,30);
		buttonStart.addActionListener(this);
		add(jlbem);
		add(jl);		
		add(buttonStart);
this.repaint();


	}

Diese Funktion soll mir nur weitere Componenten in meinem Fenster ausgeben. Sobald ich den Button "Starten" drücke soll folgender Code aufgerufen werden:

Java:
			datei = new dateiVerb();
			datei.main(selectedFile);

Damit verlasse ich meine Start.java und gehe zur Verarbeitung.java rüber indem das File gelesen wird und sich das neue Fenster mit der TextArea öffnen soll:

Java:
public class dateiVerb{
	
	//private static String selectedFile;
	public JTextArea dasTextfeld;
	
	public DateiVerarbeitung()
	{
		JFrame f = new JFrame();	
		f.setSize(500,500);
		dasTextfeld = new JTextArea("Die Verarbeitung wird gestartet",400,400);
		dasTextfeld.setBounds(0, 0, 450,450);
		f.add(new JScrollPane(dasTextfeld));
		f.setVisible(true);

	}
public void verarbeiten(String selectedFile){
                String test;
               liste = new ArrayList<String>();

		try {
			br = new BufferedReader(new FileReader(selectedFile));


			try {

				while ((line = br.readLine()) != null)
				{
					test= line.substring(14,31);

					if(test.equals(Nr))
					{
						liste.add(line);
					}
					else {
						if (!liste.isEmpty())
						schreibeDaten(liste);   -----> da liegt anscheindend der Fehler
						liste.clear();
						liste.add(line);
						Nr = line.substring(14,31);

					}
				 }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				JOptionPane.showMessageDialog(null,"Fehler beim einlesen der Datei","Fehler", JOptionPane.ERROR_MESSAGE);
			}	
				
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				
				//FehlermeldungsPopUp
				JOptionPane.showMessageDialog(null,"Datei konnte nicht eingelesen werden","Fehler", JOptionPane.ERROR_MESSAGE);

			}	
				

	}
}
		public void main(String selectedFile2) 
		{System.out.println(selectedFile2);
	       
	        verarbeiten(selectedFile2);
		}

Sobald ich den Funktionsaufruf auskommentiere sehe ich meine TextArea in meinem Frame alles wunderbar. Nur wenn ich den Funktionsaufruf wieder einfüge habe ich wieder mein alt bewertes Problem. In der Funktion wird nur das eingelesene File anhand von if else Anweisungen bearbeitet.
 
Zuletzt bearbeitet:
Poste dochmal dein Programm im Zusammenhang und nicht immer zerstückelt.
Ich persönlich blicke da so nichtmehr ganz durch 🙂
 
Hi,

also der Fehler kommt definitiv aus der dateiVerb.java irgendwo in der Verarbeitung.

Java:
import etc.

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class dateiVerb{
	
	
	public JTextArea dasTextfeld;
	
	public DateiVerarbeitung()
	{
		JFrame f = new JFrame();	
		f.setSize(500,500);
		dasTextfeld = new JTextArea("Die Verarbeitung wird gestartet",400,400);
		dasTextfeld.setBounds(0, 0, 450,450);
		f.add(new JScrollPane(dasTextfeld));
		f.setVisible(true);

	}


	//Kunden 
	private String KNr;
	private String KNachname;
	private String KName;
	private String KStr;
	private String KOrt;
	private String KPLZ;
	private String KMail;
	private String KTelPr;
	private String KTelGes;
	
	
	//Verarbeitung Member
	private String line;
	private BufferedWriter out;
	private BufferedReader br;
	private connect verbindung;
	private ArrayList<String> liste;
	private String VersNrTmp;
	private String rueckmeldung;
	private ArrayList<String> rueckmeldungTmp;
	private int ergUpdate;
	private Properties prop;
	private boolean ergCdx;


	public void verarbeiten(String selectedFile){


		String Test;

		liste = new ArrayList<String>();
		

		dasTextfeld.append("File: "+ selectedFile);
		

				//Vertrag.cdx Datei zuerst löschen
				File cdx = new File("C:\\Test\\Test.Cdx");

				ergCdx = cdx.exists();
				
				if(ergCdx == true)
				{
					ergCdx = cdx.delete();
					
					if(ergCdx == true)
					{
						System.out.println("Test.cdx gelöscht");
					}
					else
					{
						JOptionPane.showMessageDialog(null,"Die Datei Test.Cdx konnte nicht gelöscht werden. Verarbeitung Ende","Fehler", JOptionPane.ERROR_MESSAGE);
					}
				}
				else if(ergCdx == false)
				{
					System.out.println("Test.cdx nicht existent");
				}

				
	
		try {
			br = new BufferedReader(new FileReader(selectedFile));


			try {
				
				while ((line = br.readLine()) != null)
				{
					Nr= line.substring(14,31);

					if(Test.equals(Nr))
					{
						liste.add(line);
					}
					else {
						if (!liste.isEmpty())
						schreibeDaten(liste);
						liste.clear();
						liste.add(line);
						Nr= line.substring(14,31);

					}
				 }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				JOptionPane.showMessageDialog(null,"Fehler beim einlesen der Datei","Fehler", JOptionPane.ERROR_MESSAGE);
			}	
				
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				
				//FehlermeldungsPopUp
				JOptionPane.showMessageDialog(null,"Datei konnte nicht eingelesen werden","Fehler", JOptionPane.ERROR_MESSAGE);

			}	
				

	}

		


	public boolean schreibeDaten(ArrayList<String> dieDaten)
	{
		
		//Datenbank Verbindung aufbauen
	    verbindung = new connect();
		verbindung.connection();

        //Über gesamten block gehen und Variablen zuweisen
        for (int i=0;i<dieDaten.size();i++)
        { 
        	
        	if(dieDaten.get(i).substring(0,4).equals("0123") )
        	{
        		KNachname = dieDaten.get(i).substring(43, 73);
        		KName = dieDaten.get(i).substring(103,133);
        		KStr = dieDaten.get(i).substring(187, 218);
        		KOrt = dieDaten.get(i).substring(162, 186);
        		KPLZ = dieDaten.get(i).substring(156, 161);

        	}

       
        }

        //Neues Objekt der Klasse Date instanziieren
        Date now = new Date();
        //Mit dem SimpleDateFormat wird eine Datumsstruktur festgelegt
        SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy");
        //Das heutige Datum wird in diese zuvor festgelegte Struktur geparst
        String dateStr = formatter.format(now);

        //Pfadangabe wo das neue File gespeichert wird
        File file = new File("D:\\Test\\"+dateStr+".txt");

        rueckmeldung = verbindung.suchen(KNr);

        
        if(rueckmeldung != null)
        {		

	  ergUpdate = verbindung.updateNr(KStr,KPLZ,KOrt,KNr);
	  	   
	  //Wenn das Update erfolgreich war, bitte anzeigen
           if(ergUpdate == 1)
           {
        	   System.out.println("Update erfolgreich");
           }
           else
           {
        	   System.out.println("Kein Update"); 
           }
           
       
			return true;
        }else
        {
               try{
            	    FileWriter writer = new FileWriter(file ,true); 
            	          
            
            		for (int i=0;i<dieDaten.size();i++)
            		{
            			writer.write(dieDaten.get(i)+System.getProperty("line.separator"));
            		}  	

            	    writer.flush();

           	        writer.close();
            	   }catch (IOException e) {          	    	   
            	       } 

        }

	}
		public void main(String selectedFile2) 
		{
	       
	        verarbeiten(selectedFile2);
		}



	


}
 
So wird dir vermutlich keiner weiterhelfen können, da überhaupt nicht klar ist, wer was wann wo aufruft.

Und so Dinge wie:

Java:
public class dateiVerb{ //<--- Klasse
...
    public DateiVerarbeitung() //<-- Wo kommt denn der Konstruktor her?
    {
        ...
    }

zeigen leider nur absolutes Chaos 😀

Vielleicht blickt ja wer anders durch
 
Zuletzt bearbeitet:
Ich hab mal "versucht" etwas Struktur reinzubringen - soweit das möglich war...

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class DateiVerarbeitung
{

	public JTextArea	dasTextfeld;

	public DateiVerarbeitung()
	{
		JFrame f = new JFrame();
		f.setSize(500, 500);
		dasTextfeld = new JTextArea("Die Verarbeitung wird gestartet", 400, 400);
		dasTextfeld.setBounds(0, 0, 450, 450);
		f.add(new JScrollPane(dasTextfeld));
		f.setVisible(true);

	}

	public void verarbeiten(String selectedFile)
	{
		dasTextfeld.append("File: " + selectedFile);

		// Vertrag.cdx Datei zuerst löschen
		File cdx = new File("C:\\Test\\Test.Cdx");

		boolean ergCdx = cdx.exists();

		if (ergCdx == true)
		{
			ergCdx = cdx.delete();

			if (ergCdx == true)
			{
				System.out.println("Test.cdx gelöscht");
			}
			else
			{
				JOptionPane.showMessageDialog(null, "Die Datei Test.Cdx konnte nicht gelöscht werden. Verarbeitung Ende", "Fehler", JOptionPane.ERROR_MESSAGE);
				return;
			}
		}
		else if (ergCdx == false)
		{
			System.out.println("Test.cdx nicht existent");
		}

		ArrayList<String> liste = new ArrayList<String>();
		try
		{
			BufferedReader br = new BufferedReader(new FileReader(selectedFile));

			try
			{

				String line;
				while ((line = br.readLine()) != null)
				{
					String nr = line.substring(14, 31);

					if (test.equals(nr))
					{
						liste.add(line);
					}
					else
					{
						if (!liste.isEmpty())
							schreibeDaten(liste);
						liste.clear();
						liste.add(line);
						nr = line.substring(14, 31);
					}
				}
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				JOptionPane.showMessageDialog(null, "Fehler beim einlesen der Datei", "Fehler", JOptionPane.ERROR_MESSAGE);
			}

		}
		catch (FileNotFoundException e1)
		{
			// TODO Auto-generated catch block

			// FehlermeldungsPopUp
			JOptionPane.showMessageDialog(null, "Datei konnte nicht eingelesen werden", "Fehler", JOptionPane.ERROR_MESSAGE);

		}

	}

	public boolean schreibeDaten(ArrayList<String> dieDaten)
	{

		// Datenbank Verbindung aufbauen
		Connection verbindung = new Connection();
		verbindung.connect();

		// Mit dem SimpleDateFormat wird eine Datumsstruktur festgelegt
		SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy");

		// Neues Objekt der Klasse Date instanziieren
		Date now = new Date();
		// Das heutige Datum wird in diese zuvor festgelegte Struktur geparst
		String dateStr = formatter.format(now);
		// Pfadangabe wo das neue File gespeichert wird
		File file = new File("D:\\Test\\" + dateStr + ".txt");

		FileWriter writer = new FileWriter(file, true);

		// Über gesamten block gehen und Variablen zuweisen
		for (int i = 0; i < dieDaten.size(); i++)
		{
			String kundenNr = dieDaten.get(i).substring(0, 4);
			String kundenNachname = dieDaten.get(i).substring(43, 73);
			String kundenName = dieDaten.get(i).substring(103, 133);
			String kundenStr = dieDaten.get(i).substring(187, 218);
			String kundenOrt = dieDaten.get(i).substring(162, 186);
			String kundenPLZ = dieDaten.get(i).substring(156, 161);
			String kundenMail;
			String kundenTelPr;
			String kundenTelGes;

			// Zum Testen
			if (!kundenNr.equals("1234"))
				continue;

			String rueckmeldung = verbindung.suchen(kundenNr);

			if (rueckmeldung != null)
			{

				int ergUpdate = verbindung.updateNr(kundenStr, kundenPLZ, kundenOrt, kundenNr);

				// Wenn das Update erfolgreich war, bitte anzeigen
				if (ergUpdate == 1)
				{
					System.out.println("Update erfolgreich");
				}
				else
				{
					System.out.println("Kein Update");
				}

				return true;
			}
			else
			{
				try
				{

					writer.write(dieDaten.get(i) + System.getProperty("line.separator"));
					writer.flush();
				}
				catch (IOException e)
				{
					System.err.println("Konnte Datensatz " + i + " nicht schreiben");
				}
			}
		}
		writer.close();
	}

	public void main(String selectedFile2)
	{

		verarbeiten(selectedFile2);
	}

}

Aber es gibt noch einige Ungereimtheiten wie z.B. die Variable test. (Die ist nichtmal initialisert...)

Und die vielen statisch programmierten Datei-Namen gefallen mir auch nicht.
Hinzu kommt noch der Mischmasch aus Deutsch und Englisch (Ich währe eindeutig für englisch - das liest sich im gesamten besser)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben