Klassen Thread über if Anweisung starten und von anderer Klassen über Button Beenden

Bluedaishi

Bekanntes Mitglied
Hallo alle zusammen,

ich hab ein großes Problem an dem ich schon seit Tagen fest sitze und nicht weiter komme .
Mein Problem ich habe eine Textdatei in dem nach eine bestimmten Zeile gesucht wird,
über eine if Anweisung frage ich die größe des Strings ab ob er null ist oder nicht.
Wenn er null ist soll sich ein neues Auswahl Fenster öffnen und die for schleife anhalten solange bis
im Auswahl Fenster eine Auswahl getätigt was mit einem Ok Button bestätigt werden muss.
Durch das Betätigen des Ok Buttons soll das Auswahl Fenster wieder schliessen und die for schleife weiter laufen.

Mein Problem ist das for schleife immer weiter läuft aber und sich nur ein Auswahl Fenster öffnet

Könnte mir vielleicht jemand weiter helfen wäre super von euch

Danke schön
 
Schau mal hier:

Java:
import java.lang.reflect.InvocationTargetException;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;


public class Test implements Runnable{
	
	private boolean running = false;
	
	private int iterationen = 100*100;

	@Override
	public void run() {		
		this.running = true;
		// die for Schleife für 100*100 Iterationen
		for (int i = 0; i < this.iterationen; i++) {
			// ob Abgebrochen werden soll
			if(this.running == false){
				// stop vor schleife
				break;
			}
			
			// wenn i durch 10 teilbar ist
			if(i % 10 == 0){
				try {
					// dialog anziegen
					openDialog(i);
				} catch (Exception e) {					
					e.printStackTrace();
				}				
			}
			System.out.println("Index: " + i);			
		}	
		// ende ausgeben
		System.out.println("End!");
	}

	private void openDialog(final int i) throws InterruptedException, InvocationTargetException {
		// Dialog mit Hilfe des EventDispatchers Öffnen und Warten
		SwingUtilities.invokeAndWait(new Runnable() {			
			@Override
			public void run() {
				// Dialog öffnen, und so lange blockieren
				String s = JOptionPane.showInputDialog("Index: " + i);		
				// wenn Abbruch = stoppen
				if(s == null){
					running = false;
				}
			}
		});
	}
	
	public static void main(String[] args) {
		// runs Test
		Test test = new Test();
		test.run();
	}

}
 
hey schon mal vielen Dank für die schnelle Antwort ich werde gleich mal versuchen
hier etwas Quelltext schreiben vielleicht kommen wir ann weiter.
 
ist nur ein ausschnitt sonst wird es zuviel


Java:
						raf.seek(long_hallennr);
						line = raf.readLine();
						line = line.substring(15, 24);
						line = line.replaceFirst("0+", "").trim();
						
						System.out.println(line.length());
						
						if(line.length() == 0){
		
						new FirmaAuswahl(dateiName);
						Thread.sleep( 4000 );                   hier soll die for schleife warten bis in der anderen Klassen 
                                                                                                der OK button gedrückt wird
							

						
						}
 
Also ich glaube er versucht Zeilenweise aus einer Text Datei zu lesen. Fall die Text Zeile leer ist, will er ein Dialog Anzeigen und den lese Prozess stoppen. Mit Hilfe des Dialoges einen Wert eingeben und weiter lesen.
 
Hey hätte ja nicht gedacht das ich gleich soviel hilfe bekomme 🙂 ich poste dann doch mal den Quelltext 🙂


Java:
public class StatistikWerteLesen {
	
	public static String Hersteller = null;
	public static String Geraete_typ = null;
	public static String Hallen_nr = null;
	public static String Hallen_nr1 = null;
	public static String Geraete_nr = null;
	public static String Zulassungs_nr = null;
	public static String Bauart = null;
	public static String Streifen_nr = null;
	public static String Kass_datum = null;
	public static String KassLe_datum = null;
	public static String Einwurf_sum = null;
	public static String Auswurf_sum = null;
	public static String Saldo1_sum = null;
	public static String EKkasse_sum = null;
	public static String Saldo2_sum = null;
	public static String dateiWGS = null;
	public static String[] firmaList;
	public static Thread t = new Thread();
	
	public StatistikWerteLesen() throws Exception {
		
		String[] dateiInhalte = EinLesenStreifenInhalt.dateiInhalte;
		String[] dateiNamen = EinLesenStreifenNamen.dateiListe;
		String Verz = DatenImport.Verz + "\\";
		
		
		long long_hersteller = 0L;
		long long_geraetetyp = 0L;
		long long_hallennr = 0L;
		long long_geraetenr = 0L;
		long long_zulassungsnr = 0L;
		long long_bauart = 0L;
		long long_streifennr = 0L;
		long long_kassdatum = 0L;
		long long_kassdatumle = 0L;
		long long_einwurf = 0L;
		long long_auswurf = 0L;
		long long_saldo1 = 0L;
		long long_ekkasse = 0L;
		long long_saldo2 = 0L;
		
		getDBFirmen();
	
		
		for (int i = 0; i < dateiInhalte.length; i++ ) {
	
			
				
		 final String dateiName = dateiNamen[i];
		 final String dateiInhalt = dateiInhalte[i];
		  
			File file = new File(Verz + dateiNamen[i]);
			
			RandomAccessFile raf = null;
			
			try {
				raf = new RandomAccessFile(file, "r");
				String line = null;

				while ((line = raf.readLine()) != null) {
					if (line.contains("\033K!")) {
						long_hersteller = raf.getFilePointer();
					}
					if (line.contains("\033K\"")) {
						long_geraetetyp = raf.getFilePointer();
					}
					if (line.contains("\033K#")) {
						long_hallennr = raf.getFilePointer();
					}
					if (line.contains("\033K$")) {
						long_geraetenr = raf.getFilePointer();
					}
					if (line.contains("\033KC")) {
						long_zulassungsnr = raf.getFilePointer();
					}
					if (line.contains("\033K)")) {
						long_bauart = raf.getFilePointer();
					}
					if (line.contains("\033K%")) {
						long_streifennr = raf.getFilePointer();
					}
					if (line.contains("\033K&")) {
						long_kassdatum = raf.getFilePointer();
					}
					if (line.contains("\033K'")) {
						long_kassdatumle = raf.getFilePointer();
					}
					if (line.contains("\033KQ")) {
						long_einwurf = raf.getFilePointer();
					}
					if (line.contains("\033KR")) {
						long_auswurf = raf.getFilePointer();
					}
					if (line.contains("\033KS")) {
						long_saldo1 = raf.getFilePointer();
					}
					if (line.contains("\033KB")) {
						long_ekkasse = raf.getFilePointer();
					}
					if (line.contains("\033KX")) {
						long_saldo2 = raf.getFilePointer();
						break;
					}

				}
				
				raf.seek(long_hersteller);
				line = raf.readLine();
				if (line.contains("GEWETE")) {
				
				}else{
						Hersteller = line;

						raf.seek(long_geraetetyp);
						line = raf.readLine();
						Geraete_typ = line;

						raf.seek(long_hallennr);
						line = raf.readLine();
						line = line.substring(15, 24);
						line = line.replaceFirst("0+", "").trim();
						
						System.out.println(line.length());
						
						if(line.length() == 0){
		
						new FirmaAuswahl(dateiName);
						Thread.sleep( 4000 ); 
						//	das mit dem Thread.sleep funktioniert gefällt mir aber nicht 
                                                //      weil das Auswahl Fenster beim nächsten mal überschrieben wird 
                                                // hier an dieser Stelle soll die Klasse FirmaAuswahl aufgerufen werden
 						// und hier soll es erst weiter gehen wenn eine Firma ausgewählt wurde
                                                //
						}
						
						if(line.length() > 0 ){
						
						raf.seek(long_hallennr);
						line = raf.readLine();
						line = line.substring(15, 24);
						line = line.replaceFirst("0+", "").trim();
						Hallen_nr = line;
 
Das nutz mir nicht viel weil die Firmen in einer Mysql Datenbank liegen . Deshalb habe ich in dem Auswahl Fenster
eine JList worin die Firmen enthalten sind . 🙂
 
Moment 🙂 nochmal langsam 🙂 sonst reden wir an einander vorbei 🙂


also Ich lese einen text ein.
suche nach bestimmten text zeilen
die werte die ich brauche füge ich in eine DB ein
wenn die Zeile leer ist soll sich das Auswahl Fenster Öffnen
die Firmen aus der DB holen damit ich den Text der mir in einer
TextArea angezeigt wird einer Firma zu ordnen kann

so ist der Plan 🙂
 
Das funktioniert auch schon soweit nur das ich das nicht mit dem Thread.sleep(); haben möchte ,denn wenn der nächste text kommt und an der stelle auch null ist überschreibt er das geöffnete fenster einfach . :-(
 
Ja ok, also machst du dein Fenster als Modalen Dialog! und rufst ihn so auf:
Java:
SwingUtilities.invokeAndWait(new Runnable() {           
   @Override
   public void run() {
      new FirmaAuswahl(...);
   }
});

Das Blockiert solange wie der Dialog anzeiget wird!
 
Also du hast deine [JAPI]JList[/JAPI] mit den Firmen auf eine [JAPI]JDialog[/JAPI] jetzt? Wenn ja musst du nur setVisable(true) für die Anzeige machen.
[EDIT]Kein [JAPI]JFrame[/JAPI] sonder [JAPI]JDialog[/JAPI][/EDIT]
 
SSSSSSSSSUpperrrrr Danke schön für deine Hilfe es Funktioniert jetzt das setVisible(true) war an falscher stelle gesetzt 🙂 🙂
nochmals vielen dank 🙂
 
Hab mich wohl zu früh gefreut 🙂 jetzt hab ich das problem das ich den String mit dem Dateinamen nicht an die innere Klasse über gegeben kann .
 
Also ich meine ich kann die andere klasse nicht mit
Java:
new FirmaAuswahl(dateiName);
aufrufen
dazu müsste er dann final sein nur dann hab ich immer den selben text :-(
 
Ich würde das so machen:
Java:
private void openFirmaAuswahl(final String dateiName) throws Exception {        
   SwingUtilities.invokeAndWait(new Runnable() {           
      @Override
       public void run() {
          new FirmaAuswahl(dateiName);
       }
    });
}
 
Ja das hab ich schon versucht . Aber Eclipse gibt einen Fehler aus das ich den String nicht in eine innere Klasse übergeben kann und muss ihn deshalb auf final setzten .
Nur dann hab ich wie gesagt das Problem das ich immer den selben text sehe und auch die selben werte in die DB eingetragen werden :-(
 
Java:
	if(line.length() == 0){
		
							
							SwingUtilities.invokeAndWait(new Runnable(){
							@Override
							public void run(){
									FirmaAuswahl.textStreifen.append(dateiInhalt);
									new FirmaAuswahl(dateiName);
							}
							});
						}
 
das Problem ist das ich da nicht so ganz weiter komme :-(
Ich versteh Dein Problem nicht.
Hier mal eine Demo die so abläuft, wie - ich es verstanden habe - Du es haben willst.
Statt von der Datei zu lesen erzeuge ich einfach eine Zufallszahl zw. 0 und 9 (wobei 7 == leere Zeile) und "gespeichert" wird, statt in der DB in einer TextArea:
Java:
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Blub {
	public static void main(String[] s) {
		new Blub().startDemo();
	}

	private JTextArea area;
	private SelectionDialog dialog;

	public void startDemo() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		area = new JTextArea();
		frame.add(new JScrollPane(area));
		frame.setBounds(0, 0, 300, 200);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);

		dialog = new SelectionDialog(frame);

		// Simulate reading
		new Thread(new Runnable() {
			private Random rnd = new Random();

			public void run() {
				while (true) {
					try {
						// generate dummy value
						int value = rnd.nextInt(10); //instead of reading a real file
						if (value == 7) { // line is empty
							dialog.setVisible(true);
							Object manualValue = dialog.getSelectedValue();
							area.setText("manual input: " + manualValue + "\n" + area.getText());
						} else { //line is not empty
							area.setText("read: " + value + "\n" + area.getText());
						}
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
	}
}

class SelectionDialog extends JDialog {
	private DefaultListModel model;
	private JList list;

	public SelectionDialog(Frame frame) {
		super(frame, true); // modal
		model = new DefaultListModel();
		for (int i = 0; i < 26; i++) {
			model.addElement("Element " + Character.toString((char) (65 + i)));
		}
		list = new JList(model);
		this.add(new JScrollPane(list));
		JButton button = new JButton("OK");
		this.add(button, BorderLayout.SOUTH);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setVisible(false);
			}
		});
		
		this.pack();
		this.setLocationRelativeTo(frame);
	}

	public Object getSelectedValue() {
		return list.getSelectedValue();
	}
}
 
Hi Michael,

vielen dank für deine Hilfe . Hab das problem anders gelöst und zwar mit getter und setter 🙂

ich in der anderen klasse FirmaAuswahl mit einem Actionlistener Arbeite
kann ich den dateinamen nicht direkt übergeben .
Java:
	if(line.length() == 0){
							
								StatistikWerteLesen.setDatei(dateiName);
								StatistikWerteLesen.getDatei();
								
								StatistikWerteLesen.setDateiInhalt(dateiInhalt);
								StatistikWerteLesen.getDateiInhalt();
							
							  SwingUtilities.invokeAndWait(new Runnable() {           

								@Override
							       public void run() {
							    	  
									FirmaAuswahl.textStreifen.append(dateiInhalt);
							    	new FirmaAuswahl();
									}
							  	});
							}


so das ist meine Lösung die sehr gut Funktioniert 🙂
vielen dank nochmal an alle die mir geholfen haben 🙂

so ich werd mich jetzt an eine JTable mach hat da vielleicht jemand Ahnung von ich hab hier schon im Forum in der Hilfe Abteilung nach gesehen doch so wirklich schlau daraus bin ich nicht geworden 🙂
 

Zurück
Oben