# Key-Listener richtig "einbauen"



## SteeL1942 (22. Dez 2009)

ich habe versucht, mir mit java einen kleinen Taschenrechner zu basteln. das hat auch soweit geklappt. jetzt wollte ich, um das ganze abzurunden, noch ein paar keylistener einbauen, mit denen sich der rechner auch bedienen lässt. allerdings funktioniert das nicht... ich weis nicht, was ich falsch mache. ich hatte das schonmal so gemacht und da lief es wunderbar.
habe auch schon verschiedene varianten ausprobiert, die ich hier über die su-fu gefunden habe, aber es lief keine einzige 
hier mal der programm-code. der keylistener befindet sich am ende der klasse.
danke schon mal vorweg


```
import java.awt.*;
import java.awt.event.*;

class Double_Rechner extends Frame
{
		private Panel zNord = new Panel();
		private Panel zSued = new Panel();
		private Panel zMitte = new Panel();
		private Panel Buttons = new Panel();
		private Panel PZahlen = new Panel();
		private Panel PRechenzeichen = new Panel();
		private TextField Tz1 = new TextField();
		private double z1;
		private int s, r;
		private Color beige=new Color(240,240,180);
		private Button zLoeschen=new Button("Löschen");
		private Button Beenden = new Button("Beenden");
		private Button Zurueck = new Button("Zurück");
		private Button [] Rechenzeichen = {new Button ("C"), new Button ("+"),new Button ("-"), new Button ("*"), new Button ("/"), new Button ("sqrt"), new Button ("x²"), new Button ("x³"),new Button ("x^y"), new Button ("+/-"), new Button("1/x"), new Button ("=")};
		private Button [] Zahlen = {new Button ("1"),new Button ("2"), new Button ("3"), new Button ("4"), new Button ("5"), new Button ("6"), new Button ("7"), new Button("8"), new Button ("9"), new Button("0"), new Button(","), new Button ("(-)")};
		
		private int n = 0;
public Double_Rechner()
		{
			setTitle("Taschenrechner");
			
			zNord.setLayout(new FlowLayout());
			zNord.setBackground(beige);
			zNord.setFont(new Font ("Helvetica", 50,20));
			zNord.add(new Label("Taschenrechner"));
			zMitte.setLayout(new GridLayout(2,1));
			zMitte.setFont(new Font ("Helvetica", 50,20));
			zMitte.setBackground(Color.lightGray);
			zMitte.add(Tz1);
			zMitte.add(Buttons);
			Buttons.setLayout(new GridLayout(1,2));
			Buttons.add(PZahlen);
			Buttons.add(PRechenzeichen);
			PZahlen.setLayout(new GridLayout(4,3));
			PRechenzeichen.setLayout(new GridLayout(4,3));
			do
			{
				PZahlen.add(Zahlen[n]);
				PRechenzeichen.add(Rechenzeichen[n]);
                   Zahlen[n].setFocusable(false);
				Rechenzeichen[n].setFocusable(false);
				n = n+1;
			}while(n<=11);
			zSued.setLayout(new GridLayout(1,3));
			zSued.setBackground(beige);
			zSued.add(zLoeschen);
			zSued.add(Zurueck);
			zSued.add(Beenden);

			addKeyListener(this);
			
			this.setLayout( new BorderLayout(5,5));
			this.add("North",zNord);
			this.add("South", zSued);
			this.add("Center",zMitte);
		
			Zahlen[0].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(1);
					}});
			
			Zahlen[1].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(2);
					}});
			
			Zahlen[2].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(3);
					}});
			
			Zahlen[3].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(4);
					}});
			
			Zahlen[4].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(5);
					}});
			
			Zahlen[5].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(6);
					}});
			
			Zahlen[6].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(7);
					}});
			
			Zahlen[7].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(8);
					}});
			
			Zahlen[8].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(9);
					}});
			
			Zahlen[9].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(0);
					}});
		
		Zahlen[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("0.");
					s=1;
				}
				else
				{
					Tz1.setText(Tz1.getText()+".");
				}
				}});
		
		Zahlen[11].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("-");
					s=1;
				}
				}});
		
		Rechenzeichen[0].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				s=0;
				r=0;
				z1=0;
				Tz1.setText("");
				}});
		
		Rechenzeichen[1].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				s=0;
				r=1;
				}});
		
		Rechenzeichen[2].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=2;
				s=0;
				}});
		
		Rechenzeichen[3].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=3;
				s=0;
				}});
		
		Rechenzeichen[4].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=4;
				s=0;
				}});
		
		Rechenzeichen[5].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.sqrt(getZahl(Tz1)));
				s=0;
				}});
		
		Rechenzeichen[6].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.pow(getZahl(Tz1),2));
				s=0;
				}});
		
		Rechenzeichen[7].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.pow(getZahl(Tz1),3));
				s=0;
				}});
		
		Rechenzeichen[8].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=5;
				s=0;
				}});
		
		Rechenzeichen[9].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+(getZahl(Tz1)*-1));
				s=0;
				}});
		
		Rechenzeichen[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+(1/getZahl(Tz1)));
				s=0;
				}});
		
		Rechenzeichen[11].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				s=0;
				r=0;
				}});
		
		zLoeschen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			   Loeschen();
				}});
		
		Beenden.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            	}});
		
		Zurueck.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                Auswahl a = new Auswahl();
                a.starte();
                a.setSize(300,200);
                a.setLocation(getLocation());
                a.setVisible(true);
                setVisible(false);
            	}});
		
		Tz1.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e)
            {
        			rechne();
        			z1 = getZahl(Tz1);
        			s=0;
        			r=0;           
            }
            public void keyPressed(KeyEvent keyevent){}
            public void keyReleased(KeyEvent keyevent){}
			});
		
	}
		
	private void rechne()
	{
		switch(r)
		{
		case 0:
		break;
		case 1: Tz1.setText(""+(z1+getZahl(Tz1)));
		break;
		case 2: Tz1.setText(""+(z1-getZahl(Tz1)));
		break;
		case 3: Tz1.setText(""+(z1*getZahl(Tz1)));
		break;
		case 4: Tz1.setText(""+(z1/getZahl(Tz1)));
		break;
		case 5: Tz1.setText(""+(Math.pow(z1,getZahl(Tz1))));
		break;
		}
		z1=0;
	}												
	
	public void Schreibe (int i)
	{
		if(s==0)
		{
			Tz1.setText(""+i);
			s=1;
		}
		else
		{
			Tz1.setText(Tz1.getText()+i);
		}
	}
	
	private void Loeschen()
	{

	}
	
	private double getZahl(TextField s){return Double.valueOf(s.getText()).doubleValue();}	

}
```


----------



## eRaaaa (22. Dez 2009)

Ich habe es nur kurz überflogen, sehe zwar jede Menge addActionListener(..) aber nirgends addKeyListener(this); kann das sein?


----------



## SteeL1942 (22. Dez 2009)

joa das mit den actionlistenern nervt, aber ich brauch ja für jeden button einen...

hab die zeile jetzt mal im Konstruktor eingefügt, aber geändert hat sich nichts. kann so oft enter drücken, wie ich will - er tut nichts


----------



## javimka (22. Dez 2009)

Den KeyListener fügst du ja nur dem Frame hinzu. Aber das Frame hat nicht den Fokus, wenn du auf den Buttons rumklickst und ins Textfeld schreibst. Du müsstest den Listener wohl jeder einzelnen Komponente anhängen, die den Fokus haben könnte.

Vielleicht kannst du es dir etwas einfacher machen, in dem du erreichst, dass die Buttons den Fokus nicht haben können (setFocusable(false)) und dadurch nur das Textfeld den Fokus haben kann. Wenn du dass die Tasten drückst, wird automatisch ins Textfeld geschrieben.


----------



## noobadix (22. Dez 2009)

```
...

JTextField demoField = new JTextField(20);
demoField.addKeyListener(new demoKeyListener());

class demoKeyListener implements KeyListener{
    public void keyTyped(KeyEvent e){}
    public void keyPressed(KeyEvent e){}
    public void keyReleased(KeyEvent e){
        String word = demoField.getText();
        if(!word.equals("")) System.out.println(word);
    }
}

...
```


Soetwas habe ich nach ebenfalls flüchtigem Lesen nicht gefunden. Was sollen denn die KeyListener bewirken?

Gruß N.


----------



## SteeL1942 (22. Dez 2009)

also im prinzip brauche ich für jeden action-listener auch einen key-listener. die action-listener sind ja mit meinen buttons verbunden (also zahlen von 0-9 und rechenzeichen). jetzt möchte, ich dass wenn ich zb eine 0 eingebe, er genau das gleiche macht, als wenn ich im fenster auf den 0-Button drücke.

hab ich das jetzt richtig verstanden, dass ich also den keylistener mit dem textfeld verknüpfen muss??


----------



## noobadix (22. Dez 2009)

Okay, verstehe, aber kann es denn dann nicht zu Missverständnissen kommen? Ich vermute, du hast eine Eingabezeile, wenn du dort die Zahl 0 eingibst, soll ja noch nichts passieren. Also würde ich auf Tastenkombinationen a la "strg+0" setzen. Das geht in nem MenuItem einer MenuBar, schaue nochmal nach wie das genau funktioniert. Diese MenuBar musst du dann glaube ich nicht anzeigen lassen.


----------



## javimka (22. Dez 2009)

Es wird schwierig, grafisch den Button per Kommande drücken zu lassen. In dem Fall würde ich eher versuchen, den Button komplett selbst zu schreiben und dann eine Methode press() anbieten, die das Drücken grafisch umsetzt. In den Fall müsstest du dem JTextField einen KeyListener anhängen, der auf die Tastenanschläge reagiert. Aber wie gesagt, du tust dir einen grossen Gefallen, wenn das Textfeld die einzige Komponente ist, die den Fokus haben kann.


----------



## noobadix (22. Dez 2009)

Also folgende Idee: Du erzeugst eine MenuBar, die dem HauptJFrame hinzugefügt werden muss. Bei den MenuItems werden *dieselben* ActionListener registriert wie bei den entsprechenden Buttons. In folgendem Auszug wurde der TastenKombination "Strg + p" und dem Button 'addieren' der AddierenListener zugeschrieben.


```
...
class MyMenu extends MenuBar{

    public MyMenu(){

        Menu funktionen = new Menu("Rechenoperationen");

        MenuShortcut plus_sc = new MenuShortcut(KeyEvent.VK_P);
        MenuItem additionsItem = new MenuItem("addieren", plus_sc);
        item.addActionListener(new AddierenListener());

        funktionen.add(plus_sc);

        add(funktionen);
    }
}

//(frame sei eine Referenz auf ein JFrame)
frame.setMenuBar(new MyMenu());

JButton addButton = new JButton("addieren");
addButton.addActionListener(new AddierenListener();

class AddierenListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        //[I]Listener wird sowohl dem MenuItem als auch dem entsprechendem Button hinzugefügt[/I]
   }
}

...
```

übrigens bekommst du mit "new MenuItem("-")" so einen schicken Unterteilungsstrich in dein Menü


----------



## SteeL1942 (22. Dez 2009)

oha. jez überfordert ihr mich aber... verstehe auch nicht, weshalb ich jez ein extra menu anlegen soll.

ich vermute mal, dass ihr mich da jez falsch verstanden habt, deswegen formulier ich das nochmal anders:

ich habe da mehrer knöpfe, die halt etwas machen. jetzt brauche ich keylistener, die dafür sorgen, dass bei drücken einer bestimmten taste das gleiche passiert. heist also nicht, dass durch den tastendruck unbedingt der knopf ausgelöst werden muss.
kann ich nicht die aktionen der knöpfe in je eine methode packen. dann könnte ich die doch im actionlistener vom knopf und im keylistener angeben und hätte das theater mit diesem menu nicht, oder?


----------



## noobadix (22. Dez 2009)

SteeL1942 hat gesagt.:


> ...
> ich habe da mehrer knöpfe, die halt etwas machen. jetzt brauche ich keylistener, die dafür sorgen, dass bei drücken einer bestimmten taste das gleiche passiert. heist also nicht, dass durch den tastendruck unbedingt der knopf ausgelöst werden muss.




Ich raff's nicht...kannst du bitte ein konkretes Beispiel geben? Hab das so verstanden, dass wenn du in dein Eingabefeld bsbw. den Wert 23 eingibst, mit einer Tastenkombination beispielsweise das '+'-Zeichen hinzugefügt werden soll.


----------



## SteeL1942 (22. Dez 2009)

also: in dem textfeld stehen nur zahlen, keine rechenzeichen. der rechner läuft vom prinzip her wie der windows-taschenrechner. man kann zahlen eingeben und sobald mal ein rechzeichen anklickt bzw eingibt, wir das rechenzeichen sowie die eingebene zahl intern gespeichert. gibt man nun wieder eine zahl ein, so wird die alte zahl im textfeld überschrieben, da sie ja bei der anwahl des rechenzeichens gespeichert wurde. klickt man jetzt auf den gleich-button, so wird die erste (intern gespeicherte) zahl mit dem angeklickenten rechenzeichen mit der zweiten zahl in dem textfeld verrechnet.

ist irgendwie kompliziert zu erklären  
ich hab den rechner aber mal als ausführbare .jar-datei angehangen. vll ists dann verständlicher

aber es müsste ja auch ganz allgemein und nicht auf mein prog bezogen funktionieren:
man hat ein programm xyz. in dem programm gibt es eine methode die irgendwas macht. diese mehtode soll jetzt einmal von einem knopf ausgeführt also mit actionlistener. und einmal soll die methode abgearbeitet werden, wenn eine bestimmte taste gedrückt wird, also mit keylistener


----------



## noobadix (22. Dez 2009)

Da sehe ich dich widersprechen, einmal sagst du, dass KeyEvent und Button dasselbe tun sollen, dann nicht. Sag mir bitte was bei einem konkreten Tastendruck und was beim Drücken eine konkreten Buttons konkret geschehen soll.


----------



## SteeL1942 (22. Dez 2009)

Wenn ich den Button 1 im programm drücke, schreibt er eine "1" in das textfeld. das gleiche bei den anderen buttons für die zahlen.
jetzt möchte ich noch gerne, dass er auch eine "1" in das textfeld schreibt, wenn ich auf der tastatur die 1 drücke

das geht zwar so schon, indem man vorher einfach mit der maus in das textfeld rein klickt, aber ich hätte das gerne ohne vorherigest klicken in das textfeld, denn beim windows-taschenrechner muss ich ja auch nicht erst in das feld klicken, damit ich die tastatur benutzen kann...


----------



## noobadix (22. Dez 2009)

Dann halte ich javimkas Vorschlag für angebracht.


----------



## SteeL1942 (23. Dez 2009)

hab das jetzt mal so gemacht (und den code im ersten post aktualisiert) und es klappt auch,a ber nur bedingt.

da ich den keylistener jetzt an das TextFeld (in meinem Fall Tz1) gehangen hab, funktioniert der keylistener nur, wenn ich vorher mit der maus in das textfeld geklickt habe  kann ich das irgendwie ändern, damit der keylistener immer funktioniert, denn sobald ich einmal zwischendurch auf einen button geklickt habe, ist das textfeld nicht mehr angewählt und der keylistener macht garnix...


----------



## javimka (23. Dez 2009)

Setze die Buttons unfokusierbar mit setFocusable(false), dann hast du's.


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Taschenrechnerchen extends JPanel {

	public Taschenrechnerchen() {
		super(new BorderLayout());
		final JTextArea txf = new JTextArea(3,8);
		
		JButton btn1 = new JButton("1");
		JButton btn2 = new JButton("2");
		JButton btn3 = new JButton("3");
		btn1.setFocusable(false); // Buttons sind nicht mehr fokusierbar
		btn2.setFocusable(false);
		btn3.setFocusable(false);
		
		btn1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				txf.append("1");
			}
		});
		btn2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				txf.append("2");
			}
		});
		btn3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				txf.append("3");
			}
		});
		
		JPanel pnlButtons = new JPanel(new GridLayout(1,3));
		pnlButtons.add(btn1);
		pnlButtons.add(btn2);
		pnlButtons.add(btn3);
		
		add(txf,BorderLayout.CENTER);
		add(pnlButtons,BorderLayout.SOUTH);
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame("Taschenrechnerchen");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.add(new Taschenrechnerchen());
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}
}
```


----------



## SteeL1942 (23. Dez 2009)

hab ich so gemacht. geändert hat sich aber nichts... ich muss nach wie vor erst in das textfeld klicken. bevor der keylistener funktioniert


----------



## javimka (23. Dez 2009)

Zeig mal deinen Code mit den Änderungen.

Hast du mein Beispiel mal kompiliert? Da sollte es nämlich funktionieren.

//EDIT: Wieso verwendest du eigentlich AWT und nicht Swing? Nicht, dass es an deinem Problem etwas ändern würde, aber er würde dir wahrscheinlich kommende Probleme ersparen.


----------



## SteeL1942 (23. Dez 2009)

änderungen hab ich eingefügt. das ist mit in der do-while schleife im konstruktor, die die knöpfe in die panels packt.

warum ich awt benutze?? ganz einfach: ich hab keine ahnugn von swing. bin durch die schule zu java gekommen und ich mach das auch erst seit august. also noch nicht mal ein halbes jahr...
wir haben halt in der schule mit awt angefangen. hätte ich hier im forum nicht rumgeschaut, wüsste ich bis heute nicht, was swing eigendlich ist....


----------



## javimka (23. Dez 2009)

Das ist seltsam, bei mir funktioniert es nämlich. Kannst du nicht den kompletten Code posten, damit ich ihn bei mir ausführen kann?


----------



## SteeL1942 (23. Dez 2009)

ahhh!!
fehler gefunden. ich hatte nur die buttons in den beiden button-arrays setfocusable(false) gesetzt. ich hab aber den beenden-knopf, der alleine steht, vergessen.... ich poste jez mal das komplett richtige hier neu. und dann hab ich noch ne andere frage: kann ich die ganzen action-listener auch irgendwie in so ein array packen, damit das nicht so viel programm-code ist? das geht ja beim hinzufügen zu den panels auch, aber als ich das dann mit den action-listenern versucht hab, gings in die hose 


```
import java.awt.*;
import java.awt.event.*;

class Double_Rechner extends Frame
{
	public static void main(String args[])
    {
		Double_Rechner d = new Double_Rechner();
    	d.setSize(400,400);
    	d.setVisible(true);
    }
	
	
		private Panel zNord = new Panel();
		private Panel zSued = new Panel();
		private Panel zMitte = new Panel();
		private Panel Buttons = new Panel();
		private Panel PZahlen = new Panel();
		private Panel PRechenzeichen = new Panel();
		private TextField Tz1 = new TextField();
		private double z1;
		private int s, r;
		private Color beige=new Color(240,240,180);
		private Button zLoeschen=new Button("Löschen");
		private Button Beenden = new Button("Beenden");
		private Button Zurueck = new Button("Zurück");
		private Button [] Rechenzeichen = {new Button ("C"), new Button ("+"),new Button ("-"), new Button ("*"), new Button ("/"), new Button ("sqrt"), new Button ("x²"), new Button ("x³"),new Button ("x^y"), new Button ("+/-"), new Button("1/x"), new Button ("=")};
		private Button [] Zahlen = {new Button ("1"),new Button ("2"), new Button ("3"), new Button ("4"), new Button ("5"), new Button ("6"), new Button ("7"), new Button("8"), new Button ("9"), new Button("0"), new Button(","), new Button ("(-)")};
		
		private int n = 0;
public Double_Rechner()
		{
			setTitle("Taschenrechner");
			
			zNord.setLayout(new FlowLayout());
			zNord.setBackground(beige);
			zNord.setFont(new Font ("Helvetica", 50,20));
			zNord.add(new Label("Taschenrechner"));
			zMitte.setLayout(new GridLayout(2,1));
			zMitte.setFont(new Font ("Helvetica", 50,20));
			zMitte.setBackground(Color.lightGray);
			zMitte.add(Tz1);
			zMitte.add(Buttons);
			Buttons.setLayout(new GridLayout(1,2));
			Buttons.add(PZahlen);
			Buttons.add(PRechenzeichen);			
			PZahlen.setLayout(new GridLayout(4,3));
			PRechenzeichen.setLayout(new GridLayout(4,3));
			do
			{
				PZahlen.add(Zahlen[n]);
				PRechenzeichen.add(Rechenzeichen[n]);
				Zahlen[n].setFocusable(false);
				Rechenzeichen[n].setFocusable(false);
				n = n+1;
			}while(n<=11);
			zSued.setLayout(new GridLayout(1,3));
			zSued.setBackground(beige);
			zSued.add(zLoeschen);
			zSued.add(Zurueck);
			zSued.add(Beenden);
			
			Zurueck.setFocusable(false);
			Beenden.setFocusable(false);
			zLoeschen.setFocusable(false);
			
			this.setLayout( new BorderLayout(5,5));
			this.add("North",zNord);
			this.add("South", zSued);
			this.add("Center",zMitte);
		
			Zahlen[0].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(1);
					}});
			
			Zahlen[1].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(2);
					}});
			
			Zahlen[2].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(3);
					}});
			
			Zahlen[3].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(4);
					}});
			
			Zahlen[4].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(5);
					}});
			
			Zahlen[5].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(6);
					}});
			
			Zahlen[6].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(7);
					}});
			
			Zahlen[7].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(8);
					}});
			
			Zahlen[8].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(9);
					}});
			
			Zahlen[9].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					Schreibe(0);
					}});
		
		Zahlen[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("0.");
					s=1;
				}
				else
				{
					Tz1.setText(Tz1.getText()+".");
				}
				}});
		
		Zahlen[11].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("-");
					s=1;
				}
				}});
		
		Rechenzeichen[0].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				s=0;
				r=0;
				z1=0;
				Tz1.setText("");
				}});
		
		Rechenzeichen[1].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				s=0;
				r=1;
				}});
		
		Rechenzeichen[2].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=2;
				s=0;
				}});
		
		Rechenzeichen[3].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=3;
				s=0;
				}});
		
		Rechenzeichen[4].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=4;
				s=0;
				}});
		
		Rechenzeichen[5].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.sqrt(getZahl(Tz1)));
				s=0;
				}});
		
		Rechenzeichen[6].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.pow(getZahl(Tz1),2));
				s=0;
				}});
		
		Rechenzeichen[7].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+Math.pow(getZahl(Tz1),3));
				s=0;
				}});
		
		Rechenzeichen[8].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				r=5;
				s=0;
				}});
		
		Rechenzeichen[9].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+(getZahl(Tz1)*-1));
				s=0;
				}});
		
		Rechenzeichen[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				Tz1.setText(""+(1/getZahl(Tz1)));
				s=0;
				}});
		
		Rechenzeichen[11].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				rechne();
				z1 = getZahl(Tz1);
				s=0;
				r=0;
				}});
		
		zLoeschen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			   //ist noch leer
				}});
		
		Beenden.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            	}});
		
		Zurueck.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                //Führt zum Auswahlschirm zurück
            	}});
		
		Tz1.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e)
            {
        			rechne();
        			z1 = getZahl(Tz1);
        			s=0;
        			r=0;           
            }
            public void keyPressed(KeyEvent keyevent){}
            public void keyReleased(KeyEvent keyevent){}
			});
		
	}
		
	private void rechne()
	{
		switch(r)
		{
		case 0:
		break;
		case 1: Tz1.setText(""+(z1+getZahl(Tz1)));
		break;
		case 2: Tz1.setText(""+(z1-getZahl(Tz1)));
		break;
		case 3: Tz1.setText(""+(z1*getZahl(Tz1)));
		break;
		case 4: Tz1.setText(""+(z1/getZahl(Tz1)));
		break;
		case 5: Tz1.setText(""+(Math.pow(z1,getZahl(Tz1))));
		break;
		}
		z1=0;
	}												
	
	public void Schreibe (int i)
	{
		if(s==0)
		{
			Tz1.setText(""+i);
			s=1;
		}
		else
		{
			Tz1.setText(Tz1.getText()+i);
		}
	}
	
	private double getZahl(TextField s){return Double.valueOf(s.getText()).doubleValue();}	

}
```


----------



## javimka (23. Dez 2009)

```
for (int i=0;i<10;i++) {
  final int z = (i+1)%9; // kleine Umrechnung, weil der 0-te Button eine 1 schreibt
  zahlen[i].addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      schreibe(z);
    }
  });
}
```

Gemäss Konvention solltest du variabeln und methoden klein schreiben mit sogenanntem CamelCase (neue Wörter mit Grossbuchstaben). Klassennamen sollten keine _ beinhalten, korrekt würde deine Klasse DoubleRechner heissen.


----------



## SteeL1942 (23. Dez 2009)

javimka hat gesagt.:


> ```
> for (int i=0;i<10;i++) {
> final int z = (i+1)%9; // kleine Umrechnung, weil der 0-te Button eine 1 schreibt
> zahlen[i].addActionListener(new ActionListener() {
> ...



joa dann werd ich das mal ändern. mit dieser for-schleiße fläuft das jetzt. ich musste allerdings 
	
	
	
	





```
final int z = (i+1)%10;
```
 anstatt 
	
	
	
	





```
final int z = (i+1)%9;
```
 schreiben, damit das läuft. werd nachher mal diese for-schleife googlen, denn das kenne ich auch noch nicht


----------



## Ein Keks (23. Dez 2009)

würdest du Swing benutzen könntest du mit 
	
	
	
	





```
button.setMnemonic(int keyEvent)
```
 einfach ein Mnemonic (ne kurztaste) für nen JButton setzen (swing ist awt sehr ähnlich der größte unterschied für nen programmierer besteht in dem "J" vor den namen^^ und natürlich in mehr möglichkeiten wie ein eigenes L&F zu setzen). alternativ kannst du auch KeyBindings benutzen dann hast du nicht das Problem mit dem Fokus (Mnemonics benutzen das glaub auch)
aber auch jedenfall solltest du ma 
	
	
	
	





```
setEnabled(false)
```
 auf dein TextField aufrufen sonst kann man da ja reinschreiben was man will


----------



## SteeL1942 (23. Dez 2009)

Ein Keks hat gesagt.:


> aber auch jedenfall solltest du ma
> 
> 
> 
> ...



xDDD genau das wollte ich gerade fragen. habe jez die tastenbelegung für die rechenzeichen gemacht und es klappt auch, nur schreibt er mir dann immer die rechenzeichen in das textfeld...


----------



## SteeL1942 (23. Dez 2009)

oha. zu früh gefreut. jez geht der actionlistener nicht mehr 

gibts nicht einen befehl, der buchstaben und zeichen für das textfeld blockiert, sodass sich nur zahlen rein schreiben lassen?


----------



## javimka (23. Dez 2009)

Verwende ein JFormattedTextField:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.17 Texteingabefelder


----------



## SteeL1942 (23. Dez 2009)

javimka hat gesagt.:


> Verwende ein JFormattedTextField:
> Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.17 Texteingabefelder



wenn ich das verwende, wird ja erst geprüft, sobald ich irgendwas drücke. es muss aber geprüft werden, sobald etwas ins textfeld eingegeben wird...


----------



## eRaaaa (23. Dez 2009)

mit einem DocumentFilter sollte das gehen:

http://www.java-forum.org/bilder-gu...7213-jtextfield-dokumentarten.html#post587501

anstelle des Patterns, welches da benutzt wird, könntest du einfach "\\d+" nehmen, dann solltest du nur Zahlen eingeben können !


```
JTextField textfield = new JTextField();
	((AbstractDocument) textfield.getDocument())
		.setDocumentFilter(new DocumentSizeFilter(8, "\\d+"));
```

8 = maximale Anzahl (könntest du auch rauseditieren)


----------



## SteeL1942 (23. Dez 2009)

hmm also das bekomm ich nicht zum laufen. einen DocumentSizeFilter kennt er nicht  , aber er möchte dann einen Documentfilter importieren. is der gemeint?? wenn ich da so mache, streicht er mir   8, "\\d+"  in der klammer an...


----------



## eRaaaa (23. Dez 2009)

hast du dir den Link angeschaut den ich gepostet habe? Wahrscheinlich nicht 
Also nochmal komplett:
a)


```
JTextField textfield = new JTextField(8);
	((AbstractDocument) textfield.getDocument())
		.setDocumentFilter(new DocumentDigitFilter("\\d+"));
```

b)
DocumentSizeFilter gibt es nicht, das ist richtig, den musst du ja auch erstellen, also eine neue Klasse:
(jetzt mal bisschen angepasst)


```
import javax.swing.text.*;
import java.awt.*;
import javax.swing.*;
public class DocumentDigitFilter extends DocumentFilter {
    private final String pattern;
    public DocumentDigitFilter(final String pattern) {
        this.pattern = pattern;
    }
    @Override
    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
            throws BadLocationException {
        if (str.matches(pattern)) {
            super.replace(fb, offs, length, str, a);
        }
    }
}
```

wobei ich jetzt nicht weiß ob du auch die Beschränkung mit der maximalen Anzahl haben wolltest


----------



## SteeL1942 (24. Dez 2009)

den link hatte ich mir angesehn. bin nur nicht schlauer daraus geworden...das mit der beschränkten anzahl brauche ich nicht. besten dank. gibts irgendwo ne erklärung wie dieser digit filter arbeitet bzw was da passiert? das verstehe ich nämlich nicht...

der blockiert jetzt aber auch punkte und vorzeichen  jez kann ich keine komma-zahlen einbeben bzw ausrechnenlassen. da macht der rechner garnix mehr


----------



## eRaaaa (24. Dez 2009)

> gibts nicht einen befehl, der buchstaben und zeichen für das textfeld blockiert, sodass sich nur zahlen rein schreiben lassen?



dann hatte ich das wohl falsch verstanden :bae:

ohwei, bin auch nicht der experte in sachen regex, so sollte es jedenfalls tun was du willst denke ich:
(irgendwie aber sau umständlich, geht wahrscheinlich eleganter ;( )


```
JTextField textfield = new JTextField(8);
	((AbstractDocument) textfield.getDocument())
		.setDocumentFilter(new DocumentDigitFilter("-?\\d+\\.?\\d+"));
```

und die klasse sieht nun wie folgt aus:

```
class DocumentDigitFilter extends DocumentFilter {
    private final String pattern;

    public DocumentDigitFilter(final String pattern) {
	this.pattern = pattern;
    }

    @Override
    public void replace(FilterBypass fb, int offs, int length, String str,
	    AttributeSet a) throws BadLocationException {
	int fullLength = fb.getDocument().getLength();

	if (str.matches("-")) {
	    if (fullLength == 0) {
		super.replace(fb, offs, length, str, a);
	    }
	} else if (str.matches("\\.")) {
	    if (!fb.getDocument().getText(0, fullLength).contains(".")) {
		super.replace(fb, offs, length, str, a);
	    }
	} else if (str.matches("\\d")) {
	    super.replace(fb, offs, length, str, a);
	} else if (str.matches(pattern)) {
	    super.replace(fb, offs, length, str, a);
	}

    }
}
```


----------



## SteeL1942 (25. Dez 2009)

also so ganz läufts immernoch nicht...

erstmal hat eclipse rumgemeckert und mir einiges in der klasse rot angestrichen. der hat dann so verbesserungsvorschläge gemacht, die hab ich dann eingefügt, so:


```
class DocumentDigitFilter extends DocumentFilter {
    private final String pattern;
 
    public DocumentDigitFilter(final String pattern) {
    this.pattern = pattern;
    }
 
    public void replace(FilterBypass fb, int offs, int length, String str,
        javax.swing.text.AttributeSet a) throws BadLocationException {
    int fullLength = fb.getDocument().getLength();
 
    if (str.matches("-")) {
        if (fullLength == 0) {
        super.replace(fb, offs, length, str, a);
        }
    } else if (str.matches("\\.")) {
        if (!fb.getDocument().getText(0, fullLength).contains(".")) {
        super.replace(fb, offs, length, str, a);
        }
    } else if (str.matches("\\d")) {
        super.replace(fb, offs, length, str, a);
    } else if (str.matches(pattern)) {
        super.replace(fb, offs, length, str, a);
    }
 
    }
}
```

das gleichheitszeichen funktioniert jetzt. er schreibt auch das ergbnis mit . oder mit - da rein, aber der clear-knopf macht jez nix mehr  echt zum mäuse melken


----------



## eRaaaa (25. Dez 2009)

in deinem Listener für den Button "C" müsstest du jetzt anstatt

```
Tz1.setText("");
```

z.B.

```
try {
		    Tz1.getDocument().remove(0, Tz1.getText().length());
		} catch (BadLocationException e1) {
		    e1.printStackTrace();
		}
```

aufrufen.


----------



## SteeL1942 (25. Dez 2009)

jawoll das läuft. jez muss ich nur nochmal mit zwei anderen kleinigkeiten nerven:

einmal der .-button (intern der Zahlen[10] button). der tuts auch nicht mehr... und dann der (-) button (intern der Zahlen[11] button), mit dem man das minus als vorzeichen eingeben kann. der funktioniert zwar noch, aber sobald ich den einmal benutzt hab, kann ich keine zahlen mehr eingeben....


----------



## eRaaaa (25. Dez 2009)

hehe, also ich blick langsam nicht mehr durch  Kannst du vllt. nochmal deinen aktuellen Stand(Code) posten?


----------



## SteeL1942 (25. Dez 2009)

kein thema:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

class Double_Rechner extends JFrame
{
	public static void main(String args[])
    {
		Double_Rechner d = new Double_Rechner();
    	d.setSize(400,400);
    	d.setVisible(true);
    }
		
		private Panel zNord = new Panel();
		private Panel zSued = new Panel();
		private Panel zMitte = new Panel();
		private Panel Buttons = new Panel();
		private Panel PZahlen = new Panel();
		private Panel PRechenzeichen = new Panel();
		private JTextField Tz1 = new JTextField(8);
		private double z1;
		private int s, r;
		private Color beige=new Color(240,240,180);
		private Button Beenden = new Button("Beenden");
		private Button Zurueck = new Button("Zurück");
		private JButton [] Rechenzeichen = {new JButton ("C"), new JButton ("+"),new JButton ("-"), new JButton ("*"), new JButton ("/"), new JButton ("sqrt"), new JButton ("x²"), new JButton ("x³"),new JButton ("x^y"), new JButton ("+/-"), new JButton("1/x"), new JButton ("=")};
		private JButton [] Zahlen = {new JButton ("1"),new JButton ("2"), new JButton ("3"), new JButton ("4"), new JButton ("5"), new JButton ("6"), new JButton ("7"), new JButton("8"), new JButton ("9"), new JButton("0"), new JButton(","), new JButton ("(-)")};
		
		private int n = 0;
public Double_Rechner()
		{
			setTitle("Taschenrechner");
			zNord.setLayout(new FlowLayout());
			zNord.setBackground(beige);
			zNord.setFont(new Font ("Helvetica", 50,20));
			zNord.add(new Label ("Taschenrechner"));
			zMitte.setLayout(new GridLayout(2,1));
			zMitte.setFont(new Font ("Helvetica", 50,20));
			zMitte.setBackground(Color.lightGray);
			zMitte.add(Tz1);
			zMitte.add(Buttons);
			Buttons.setLayout(new GridLayout(1,2));
			Buttons.add(PZahlen);
			Buttons.add(PRechenzeichen);			
			PZahlen.setLayout(new GridLayout(4,3));
			PRechenzeichen.setLayout(new GridLayout(4,3));
			do
			{
				PZahlen.add(Zahlen[n]);
				PRechenzeichen.add(Rechenzeichen[n]);
				Zahlen[n].setFocusable(false);
				Rechenzeichen[n].setFocusable(false);
				n = n+1;
			}while(n<=11);
			zSued.setLayout(new GridLayout(1,3));
			zSued.setBackground(beige);
			zSued.add(Zurueck);
			zSued.add(Beenden);	    
			
			Zurueck.setFocusable(false);
			Beenden.setFocusable(false);

			((AbstractDocument) Tz1.getDocument()).setDocumentFilter(new DocumentDigitFilter("-?\\d+\\.?\\d+"));
			
			this.setLayout( new BorderLayout(5,5));
			this.add("North",zNord);
			this.add("South", zSued);
			this.add("Center",zMitte);
			
			for (int i=0;i<10;i++) {
				  final int z = (i+1)%10; // kleine Umrechnung, weil der 0-te Button eine 1 schreibt
				  Zahlen[i].addActionListener(new ActionListener() {
				    public void actionPerformed(ActionEvent e) {
				      Schreibe(z);
				    }
				  });
				}
			
		
		Zahlen[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("0.");
					s=1;
				}
				else
				{
					Tz1.setText(Tz1.getText()+".");
				}
				}});
		
		Zahlen[11].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(s==0)
				{
					Tz1.setText("-");
					s=1;
				}
				}});
		
		Rechenzeichen[0].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				s=0;
				r=0;
				z1=0;
				try {
		            Tz1.getDocument().remove(0, Tz1.getText().length());
		        } catch (BadLocationException e1) {
		            e1.printStackTrace();
		        }
				}});
		
		for (int i=1;i<12;i++) {
			  final int z = i%12;
			  Rechenzeichen[i].addActionListener(new ActionListener() {
			    public void actionPerformed(ActionEvent e) {
			    	rechne(r,z);
			    	if(z<=4)
			    	{
			    		r=z;
			    	}
			    	else
			    	{
			    		r=0;
			    	}
			    	if(z==8)
			    	{
			    		r=5;
			    	}
			    }
			  });
			}
		
		Beenden.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            	}});
		
		Zurueck.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
               //leitet zurück
            	}});
		
		Tz1.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e){}
            public void keyPressed(KeyEvent keyevent){}
            public void keyReleased(KeyEvent e)
            {
            	if(e.getKeyCode()==KeyEvent.VK_ENTER)
                {
            		rechne(r,1);
    				s=0;
    				r=0;
                } 
            }
			});
		
	}
		
	private void rechne(int i, int z)
	{
		switch(i)
		{
		case 0:
		break;
		case 1: Tz1.setText(""+(z1+getZahl(Tz1)));
		break;
		case 2: Tz1.setText(""+(z1-getZahl(Tz1)));
		break;
		case 3: Tz1.setText(""+(z1*getZahl(Tz1)));
		break;
		case 4: Tz1.setText(""+(z1/getZahl(Tz1)));
		break;
		case 5: Tz1.setText(""+(Math.pow(z1,getZahl(Tz1))));
		break;
		}
		s=0;
		switch(z)
		{
		case 0:
		break;
		case 1:
		case 2:
		case 3:
		case 4: z1 = getZahl(Tz1);
		break;
		case 5: Tz1.setText(""+Math.sqrt(getZahl(Tz1)));
		break;
		case 6: Tz1.setText(""+Math.pow(getZahl(Tz1),2));
		break;
		case 7: Tz1.setText(""+Math.pow(getZahl(Tz1),3));
		break;
		case 8: z1 = getZahl(Tz1);
		break;
		case 9: Tz1.setText(""+(getZahl(Tz1)*-1));
		break;
		case 10: Tz1.setText(""+(1/getZahl(Tz1)));
		break;
		case 11: z1 = getZahl(Tz1);
		break;
		}
	}												
	
	public void Schreibe (int i)
	{
		if(s==0)
		{
			Tz1.setText(""+i);
			s=1;
		}
		else
		{
			Tz1.setText(Tz1.getText()+i);
		}
	}
	
	private double getZahl(JTextField s){return Double.valueOf(s.getText()).doubleValue();}	

}
```


----------



## javimka (25. Dez 2009)

Der . funktioniert nicht mehr, weil der Regex-Ausdruck false ergibt und z.B. "-3." nicht akzeptiert.
Ich würde als Regex String folgendes verwenden: "-?\\d*\\.?\\d*"


----------



## SteeL1942 (25. Dez 2009)

gibt es irgendwo ne erklärung, wie man so einen filter benutzt bzw schreibt? ist echt super, dass es jetzt so läuft, aber ich fänds scho nicht schlecht, wenn ich das nächste mal zumindest ansatzweise in der lage wäre, mir sowas selbst zu basteln... ich schnalls halt nur nich, was je in dieser DocumentDigitFilter klasse passiert.


----------



## eRaaaa (25. Dez 2009)

Mhm, um das ganz zu verstehen muss man vllt ein wenig ausholen. JTextField erbt von JTextComponent, welches ein Model (Document) besitzt, welches halt für den Inhalt verantwortlich ist.
Sprich, wenn du auf deinem Textfeld z.B. die setText() -Methode aufrufst, holt sich die Oberklasse mit getDocument das Model und ändert dieses "einfach". 

```
public void setText(String t) {
        try {
            Document doc = getDocument();
            if (doc instanceof AbstractDocument) {
                ((AbstractDocument)doc).replace(0, doc.getLength(), t,null);
            }
            else {
                doc.remove(0, doc.getLength());
                doc.insertString(0, t, null);
            }
        } catch (BadLocationException e) {
	    UIManager.getLookAndFeel().provideErrorFeedback(JTextComponent.this);
        }
    }
```

Wenn du jetzt allerdings nicht willst, dass sämtliche Eingaben(Strings) erlaubt sind, musst du halt diesen Mechanismus irgendwie ändern. Man könnte z.B. auch eine eigene Document-Klasse erstellen, wo du dann die hier aufgeführten Methoden wie insertString etc. überschreibst, oder aber so wie wir das getan haben, dem Document einen eigenen Filter hinzuzufügen. Der halt nicht einfach den String einfügt, sondern einige Regeln ( wie z.B. dass nur Zahlen erlaubt sind) beachtet.

schau doch evtl. auch mal hier rein (Meine Erklärung ist vllt auch nicht die Beste  ):
Text Component Features (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) (Implementing a Document Filter)


----------



## javimka (25. Dez 2009)

Die wichtigsten Zeichen, die du jetzt im String hast:
x? = x kommt entweder einmal vor oder nicht
x+ = x kommt mindestens einmal oder beliebig oft vor
x* = x kommt nie oder beliebig oft vor
\d = eine Dezimalzahl
\. = ein Punkt

Java Regular Expressions


----------

