Problem mit FocusListener

sirconflex

Grünschnabel
hi,
ich möchte einen Taschenrechner für Complexe Zahlen erstellen. Dabei hakt es bei der Umsetzung der GUI in Awt.(speziell Event Handling)
Ich habe bereits eine Klasse geschrieben die die GUI verwalten soll, habe dabei von Frame abgeleitet und diverse buttons und 2 Textfelder eingefügt.
Soweit so gut. Nun gibt es bei den Complexen Zahlen einen Realteil und einen Imaginärteil, dies wollte ich so regeln, das durch 2 Textfelder, die Eingabe gewährleistet wird.Damit ich nicht alle Buttons doppelt machen muss( ....), habe ich mir gedacht das nur in ein Textfeld geschrieben werden kann, wenn eines der Textfelder markiert ist(focus). Hab also den FocusListener verwendet, und über eine boolsche Variable die Markierung gespeichert.
Nu hab ich aber das Problem das 1. wenn ich auf einen Button drücke, mein textfeld wieder focus_lost markiert wird...
2. hab ich die if-abfrage in den Konstruktor geschrieben, nachdem FocusListener... dann läuft er zwar durch aber die Knöpfe dann nicht mehr(wie auch).

Hat jemand da eine elegante Lösung wie ich das bewerkstelligen könnte, das wenn ich einen Button drücke nur in dem ausgewählten Textfeld die Zahl erscheint.

Code:
realteil.addFocusListener(new FocusListener() 

//realteil und imaginärteil sind meine textfields
	{
		public void focusGained(FocusEvent fe1)
			  {
			      if(realteil.hasFocus()) 
				  {
				     realflagon = true;
				     realteil.setText("true");
				  }
				      
				      }
		 public void focusLost(FocusEvent fe2)
		       {
			realflagon = false;	
			realteil.setText("false");
		       }	
	 }
  );
			
		  //----------------------------------------------------------------------
			
imaginärteil.addFocusListener(new FocusListener()
	 {
	     public void focusGained(FocusEvent fe3)
		 {
			imagflagon = true;
			imaginärteil.setText("true");
		  }
	    public void focusLost(FocusEvent fe4)
		  {
		      imagflagon = false;
		      imaginärteil.setText("false");
		  }	
	    }
	);
  //----------------------------------------------------------------------
		  
if(realflagon == true)
	 {
              
		number1.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent ae1)
					 {
						realteil.setText(realteil.getText() + "1");						    
						//number1.removeActionListener(this);
					}
			}
		 );	
	number2.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent ae2)
					   {
					       realteil.setText(realteil.getText() + "2");						                         //number2.removeActionListener(this);
					    }
					  
			}
		);
	 }
		  //-----------------------------------------------------------------------------
		  
if (imagflagon == true)
	 {
	       number1.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent ae3)
				    {
					 imaginärteil.setText(imaginärteil.getText() + "1");
				    }
					  
			 }
		   );

      number2.addActionListener(new ActionListener()
			     {
				 public void actionPerformed(ActionEvent ae4)
				    {
					imaginärteil.setText(imaginärteil.getText() + "2");						    	//number2.removeActionListener(this);
				    }
					  
				     }
		 	      );
			  }




Danke im Vorraus


MFG
Sirc
 
hmm, ich glaube deine idee mit dem flag ist schon ok, du darfst das flag nur nicht loeschen wenn du den focus verlierst sondern wenn das andere textfeld den focus erhaelt
Code:
realteil.addFocusListener(new FocusListener() 

//realteil und imaginärteil sind meine textfields
	{
		public void focusGained(FocusEvent fe1)
			  {
			     
				     realflagon = true;
                                       imagflagon = false;
				     realteil.setText("true");
				  
				      
				      }
		 public void focusLost(FocusEvent fe2)
		       {
			//mach nichts
		       }	
	 }
  );
und umgekehrt bei imaginärteil.. dann kannst du ja abfragen wer den focus hatte.
 
Das könnnte eine möglichkeit sein ,jedoch hab ich immer dann noch das Problem das
die Buttons nicht funktionieren, weil er "wahrscheinlich" nicht in die if schleife geht, wenn
die flag auf true ist, liegt wahrscheinlich daran das der code im Konstruktor der klasse steht.
Ich hatte mir überlegt, das ich ja ne Methode in der Klasse definieren könnte, die jedesmal
in der focus_gained Methode ausgeführt wird, jedoch hat dies bisher nie so richtig funktioniert.
Hat da jemand vielleicht ne idee?


So hab mal was gecodet:
Code:
public void button()
	  {
		if(realflagon == true)
		  {
			number1.addActionListener(new ActionListener()
					{
						public void actionPerformed(ActionEvent ae1)
						  {
							realteil.setText(realteil.getText() + "1");						     
							number1.removeActionListener(this);
						  }
					}
			 );	
			number2.addActionListener(new ActionListener()
					{
				  		public void actionPerformed(ActionEvent ae2)
				  		  {
				  			realteil.setText(realteil.getText() + "2");						     
				  			number2.removeActionListener(this);
				  		  }
				  
					}
			);
		
		  }
 
Zuletzt bearbeitet:
ich versteh nicht genau was du damit meinst, was fuer eine if schleife im konstruktor? Ich wuerde entweder anstelle von anonymenklassen ein implement benutzen oder eine eigene focusevent klasse schreiben...
 
Das Problem war das die Button nicht mehr angesprochen werden wenn ich ne if schleife wie oben drumherum "bastel".
Deshalb hab ich ne methode button() außerhalb des konstruktors(s.o.) geschrieben, die jedesmal bei focus_gained aufgerufen wird. Funktioniert auch gut, nur hab ich nun ein Probleme mit dem ActionListener. Wenn ich ihn lösche wie oben funktioniert alles, nur kann ich den Button dann nur einmal benutzen, dann muss ich das Feld wechseln und zurückspringen, dann ist er wieder benutzbar, weil er ja dann einen neuen ActionListener angelegt .... Wenn ich das Loeschen weglasse, bringt mir die if-abfrage nichts mehr, weil die Buttons dann trotzdem mit dem vorigen Listener und dem neuen arbeiten, also alles doppelt etc.
Gibt es ne Möglichkeit den Actionlistener erst dann zu löschen, wenn ich das Feld verlasse Eigentlich wollt ich mir ja das implements "aufheben" für ein anderes Interface, aber wenn es nur mit dem ActionListener Interface möglich ist, würde ich das auch so machen. Dann müsst ich aber wissen wie ich einen Listener explizit mit namen angebe, um ihn z.B in der focus_lost Methode zu loeschen.

Danke schonmal für deine vorigen Antworten

MFG
Sirc
 
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JPanel;

/*
 * Created on Jun 23, 2005
 * test
 */

public class A extends JPanel implements ActionListener, FocusListener{
	JButton b1 = new JButton();
	JButton b2 = new JButton();
	public A(){
		b1.setActionCommand("a");
		b2.setActionCommand("b");
		b1.addActionListener(this);
		b1.addActionListener(this);
		this.add(b1);
		this.add(b2);
	}
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("a")){
			if(realflagon)realteil.setText(realteil.getText() + "1");						     
			//machen was gemacht werden muss
		}else if (e.getActionCommand().equals("b")){
			//usw
		}
		
	}

	public void focusGained(FocusEvent e) {
		//der focus kram
		
	}

	public void focusLost(FocusEvent e) {
		//kann ansich leer bleiben
		
	}
	
}
so wuerde ich es machen, das ist zwar nur ein super grobes code geruest aber ich hoffe es hilft dir weiter, sonst halt nochmal posten :D
 
So hab mich grad nochmal rangesetzt und es versucht nach deiner Methode zu implementieren. Leider immernoch dieselben Probs, dass mehrere Zahlen bei einem Button Klick kommen etc......

Ich hab ungefähr 9 Buttons (Zahlen 1-9), waer nett wenn du mir den code mal für 2-3 Buttons in der actionperfomed Methode zeigen könntest....


Code:
public void actionPerformed(ActionEvent e) 
	  {
		if (e.getActionCommand().equals("1"))
		  {
		    if(realflagon == true)realteil.setText(realteil.getText() + "1");     
		    //if(imagflagon == true)imaginärteil.setText(realteil.getText() + "1");
		  }
		else if (e.getActionCommand().equals("2")){
		  }
			if(realflagon == true)realteil.setText(realteil.getText() + "2");     
			//if(imagflagon == true)imaginärteil.setText(realteil.getText() + "2");
	  	  }

		public void focusGained(FocusEvent e) 
		  {
			if(realteil.hasFocus()) 
			  {
				realflagon = true;
			    imagflagon = false;
			   // realteil.setText("true");
			   // imaginärteil.setText("false");
			  }  
			if(imaginärteil.hasFocus()) 
			  {
				realflagon = false;
			    imagflagon = true;
			   // imaginärteil.setText("true");
			   // realteil.setText("false");
			  }  
		  }

		public void focusLost(FocusEvent e) 
		  {


		  }

Man sollte um 1 Uhr nachts nicht mehr programmieren :)
 
wie mehrere zahlen? versteh ich nicht(ist auch morgens und ich brauch kaffee ^^ ) was soll den passiieren wenn du auf einen button drueckst, sind das nummern die dann im textfeld ausgegeben werden sollen(0-9), oder rechenoperationen(+,-,*,/)?
//edit ok du hast ja geschrieben das es zahen sind lol ok ertsmal kaffee dann schau ich mal....
 
ok hier isses(zumindest hoffe ich das es das ist was du wolltest)
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;

/*
 * Created on Jun 24, 2005
 * test
 */

public class p extends JPanel implements FocusListener, ActionListener{

	private JButton jButton = null;
	private JButton jButton1 = null;
	private JTextField realField = null;
	private JTextField imagField = null;
	boolean realHadFocus = false;
	boolean imaginaerHadFocus = false;
	/**
	 * This is the default constructor
	 */
	public p() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setLayout(null);
		this.setSize(300, 200);
		this.add(getImagField(), null);
		this.add(getRealField(), null);
		this.add(getJButton1(), null);
		this.add(getJButton(), null);
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */    
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setLocation(50, 94);
			jButton.setSize(65, 20);
			jButton.setText("1");
			jButton.addActionListener(this);
		}
		return jButton;
	}

	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */    
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setLocation(138, 93);
			jButton1.setSize(72, 20);
			jButton1.setText("2");
			jButton1.addActionListener(this);
		}
		return jButton1;
	}

	/**
	 * This method initializes jTextField	
	 * 	
	 * @return javax.swing.JTextField	
	 */    
	private JTextField getRealField() {
		if (realField == null) {
			realField = new JTextField();
			realField.setLocation(44, 49);
			realField.setSize(84, 19);
			realField.setName("real");
			realField.addFocusListener(this);
		}
		return realField;
	}

	/**
	 * This method initializes jTextField1	
	 * 	
	 * @return javax.swing.JTextField	
	 */    
	private JTextField getImagField() {
		if (imagField == null) {
			imagField = new JTextField();
			imagField.setLocation(150, 49);
			imagField.setSize(100, 22);
			imagField.setName("imag");
			imagField.addFocusListener(this);
		}
		return imagField;
	}

	public void focusGained(FocusEvent e) {
		JTextField field = (JTextField)e.getSource();
		if(field.getName().equals("real")){
			realHadFocus = true;
			imaginaerHadFocus =false;
		}else if(field.getName().equals("imag")){
			realHadFocus = false;
			imaginaerHadFocus =true;
		}
		
	}

	public void focusLost(FocusEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void actionPerformed(ActionEvent e) {
		setField(e.getActionCommand());
		
	}
	private void setField(String text){
		if(realHadFocus)realField.setText(realField.getText() + text);
		if(imaginaerHadFocus)imagField.setText(imagField.getText() + text);
	}

}
der code mag etwas komisch fuer dich aussehen, das liegt daran das ich ihn unter eclipse als javabean erstellt habe(zu faul alles von hand zu machen), schreib dir ne frame klasse, fuege meine klasse hinzu.....

//edit die setField meyhode ist ueberfluessig, kannst auch rausschmeissen und den inhalt in actionPerformed packen, dann musst du nur
Code:
if(realHadFocus)realField.setText(realField.getText() + text);
		if(imaginaerHadFocus)imagField.setText(imagField.getText() + text);
in
 if(realHadFocus)realField.setText(realField.getText() +e.getActionCommand());
		if(imaginaerHadFocus)imagField.setText(imagField.getText() +e.getActionCommand()t);
aendern...
 
Zuletzt bearbeitet:
Hallo!

Ich würde das mit einem Textfeld in Verbidnung mit einem regulären Ausdruck lösen.
Code:
 package de.tutorials;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class ComplexNumberExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		String regex ="(\\d+[.]?\\d+)[+-]i(\\d+[.]?\\d+)";
 		Pattern pattern = Pattern.compile(regex);
 		
 		//Darstellung der Imaginären Zahl nach Muster: RealAnteil[+-]iImaginärAnteil
 		String imgNumber= "4541.00112+i73.93";
 		Matcher matcher = pattern.matcher(imgNumber);
 		if(matcher.matches()){
 			String realPart = matcher.group(1);
 			String imgPart = matcher.group(2);
 			
 			System.out.println("Real-Teil: " + realPart);
 			System.out.println("Imaginär-Teil: " + imgPart);
 		}
 	}
 }

Gruß Tom
 
Zurück