JButton verbuggt, bitte um Hilfe!

Alex Großmann

Erfahrenes Mitglied
Hallo liebes Forum,

ich habe ein (weiteres) Problem:
Ich habe einen JButton angelegt welcher ein quasi ein Unterprogramm aufruft.
Als ich das Unterprogramm quasi für sich geschrieben habe lief noch alles normal.
Nun habe ich es in das Hauptprogramm ganz normal eingebunden (Button aufs JPanel gelegt). Wenn ich nun das Programm ausführe muss ich den Button 2x klicken bis er reagiert. Dann geht alles ganz normal, wenn man nun die Funktion des Programmes abruft (also er soll quasi eine Verbindung zur Datenbank herstellen, inhalte auslesen) vollführt er die Aktion gleich 2x!
Danke im Vorraus!

Hier mal der Code:
Java:
public  void verbindungdb() {
		
		
		//--------------------
		
		login.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		login.setSize(300,200);
		login.setLayout(new BorderLayout());
		login.setLocationRelativeTo(verbindung);
		
		//--------------------
		textarea.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		textarea.setSize(500,700);
		textarea.setLocationRelativeTo(center);
		textarea.add(textfeld);
		
		
		//--------------------
		buttonablage.add(los);
		login.add(buttonablage, BorderLayout.PAGE_END);
		center.setLayout(new GridLayout(0,2));
		center.add(dbl);
		center.add(dbtf);
		center.add(userl);
		center.add(usertf);
		center.add(pwl);
		center.add(pwtf);
		login.add(center, BorderLayout.CENTER);
		
		//--------------------
		
		verbindung.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {	
			login.setVisible(true);
	       }
		});
	
		//--------------------
		
		los.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg1) {	
				String dbname, username, passwort;
	              dbname = dbtf.getText();
	              username = usertf.getText();
	              passwort = pwtf.getText();
	              login.dispose();
	              
	              //Ignorieren:
	              //textarea.setVisible(true);
	             // ausgabe.append("Datenbankname: " + dbname + "\nUsername: " + username + "\nPasswort verborgen! \n \n -------------------- \n Verbindung wird aufgebaut!\n");
	             
	             String DBURL = "jdbc:odbc:";
	             String Driver = "sun.jdbc.odbc.JdbcOdbcDriver";
	         try {
	        		Class.forName(Driver);
	        		ausgabe.append(" Treiber wurde geladen!\n");
	        		//System.out.println("Treiber wurde geladen!");
	        	
	         	} catch (ClassNotFoundException e) {
	        		ausgabe.append("Treiber wurde nicht geladen!");
	        		e.printStackTrace();
	        		System.exit(0);
	        	}
	        	//Jetzt wird die Verbindung aufgebaut
	        	Connection con = null;
	        	
	        try {
	        		con = DriverManager.getConnection(DBURL.concat(dbname), username, passwort);
	        		ausgabe.append(" Verbindung erfolgreich!\n\nTabellen-Inhalt:\n");
	        		//System.out.println("Verbindung erfolgreich! \n\nTabellen-Inhalt:\n");
	        	} catch (SQLException e) {
	        		System.out.println("Verbindung fehlgeschlagen!");
	        		e.printStackTrace();
	        	}
	        try
	        	 {
	        Statement stmt = con.createStatement();
	        ResultSet rs = stmt.executeQuery("select * from IP");
	     
	        while(rs.next())
	        {	           
	        
	        ausgabe.append(rs.getString("ID"));
	        ausgabe.append("  ");
	        ausgabe.append(rs.getString("Netzanfang"));
	        ausgabe.append(" - ");
	        ausgabe.append(rs.getString("Netzende"));
	        ausgabe.append("\n");
	        }
	        	                  
	        rs.close();
	       
	       stmt.close();
	       
	       }
	        	         
	        	 catch(Exception exce) {
	        	System.out.println(exce.toString());
	        	 }
	        	 
			}
			;});}
 
Zuletzt bearbeitet:
Bitte nutze [code=java][/code] - Tags für Java-Source anstatt die normalen [code][/code] - Tags da durch das Syntaxhighlightning die Lesbarkeit erhöt wird.

Zu deinem Code:
1) I/O-Operationen NIEMALS im EDT ablaufen lassen. Leite hierzu eine Klasse von Thread ab und lasse es in einem separaten Thread laufen ... das verhindert das die GUI freezed und du die Kontrolle verlierst.
2) du brauchst den ODBC-Driver nicht zu laden. Seit Java1.4.2 läd der DriverManager automatisch alle zum Startzeitpunkt verfügbaren Driver ... also auch den ODBC-Driver. Selbst wenn du jetzt einen anderen Treiber nutzen willst wird dieser automatisch geladen solange er zum Start im CLASSPATH bekannt ist.
3) Du hast in Zeile 98 nur ein Exception.toString() ... versuche hier mal Exception.printStackTrace() um mehr Informationen zu bekommen.

Deine Fehlerbeschreibung ist in soweit sehr präziese ... allerdings fehlt uns ein compilebares Beispiel oder eine Erklärung wie wir diesen Fehler reproduzieren können um dir weiter zu helfen.
Auch habe ich im groben Überfliegen deines Source gemerkt das da vielleicht sogar ein Design-Fehler dran schuld sein könnte das du versuchst etwas umzusetzen was so aber nicht geht.
 
Hiho Spike,

erneut vielen Dank ;)
Danke für den Hinweis mit dem Java code! Das hab ich ganz vergessen (obwohl ich es mal gelesen habe-.-)...

Was bedeutet EDT? MultiThreading kann ich noch gar nicht, wäre aber mal Klasse wenn ich das gleich mit ins Programm einbauen könnte, da muss ich mich mal dahinter setzen.
Den Programmcode, als ganzes will ich euchum Himmelswillen nicht zumuten, da er weder Fertig noch aufgeräumt ist..
Es sollte aber deffinitiv mit Java möglich sein. Hier mal was es kann:
Es erlaubt einen Port anzulegen, dann ruft man über eine Datenbank (da oben das Unterprogramm) IP Bereiche ab. Diese werden dann durch ne Schleife gejagdt und hochgezählt und einzeln angepingt. ISt dann die IP Adresse mit dem Port verfügbar soll es ausgegeben werden. So in etwa ;)

die Exception sagt leider gar nichts oO

ps: habe meine Posts abgeändert, steht nun in Java, sieht echt viel besser aus ;)
 
Zuletzt bearbeitet:
Nun .. als Anhaltpunkt würde mir noch einfallen das er beim ersten Klick schon arbeitet ... du davon aber nichts mitbekommst weil es scheinbar eine Weile dauert ... und aus Ungeduldigkeit haust du dann gleich ein zweites Mal auf den Button ...
Versuche doch einfach mal zu warten ob nach einer gewissen Zeit etwas passiert. Das ist nämlich eins der Probleme wenn man alles im EDT ablaufen lässt : die gesamte GUI freezed *wenn auch meist nicht erkennbar* und irgendwo hakt es dann und es endet in einem DEADLOCK. Hier würde ich sehr viel Debugg-Zeilen in den Code adden um zu sehen ob er beim ersten Klick schon was macht oder eben nicht und dann wirklich einfach mal warten.
 
Natürlich habe ich schon gewartet.... bin vielleicht nicht bewandert in Java (Programmiere das erst seit 2 Wochen!) aber nicht ganz von gestern ;)

Glaubst du, mal angenommen es friert ein, wobei ich 1min Warten schon extrem lang finde(...), das man das noch Lösen könnte? Also in Form von MultiThreadding
 
Die viel interessantere Frage : was passiert wenn du das ERSTE mal auf den Button klickst ?
Nichts ? Irgendwas ? FREEZE ?
Jetzt kommt es darauf an wirklich alles Schritt für Schritt zu verfolgen und zu analysieren.
 
Offensichtlich nichts :eek:
Er kann sich eigentlich auch noch gar nicht einloggen (in die Datenbank) weil Ihm erst im nächsten Pop Up die Eingaben dafür gegeben werden.
Er loggt sich dann quasi 2x ein...echt merkwürdig...vielleicht sollte ich das ganze Segment neu schreiben oO
 
Wäre schon sinnvoll wenn du erst den Button fürs einloggen anzeigst und danach erst die Felder für die Login-Informationen.
 
Ich meinte damit das es sinnvoll wäre wenn du diesen gesamten Abschnitt neu schreiben würdest da scheinbar irgendetwas von der Reihenfolge her nicht hinhaut.
 
Zurück