# Tastatur eingaben verwenden



## HTML (11. Feb 2006)

Hi, ich hab in meinem Prog zwei TextFields und möchte gerne, dass man durch drücken der ENTER Taste zum nächsten springt. Sozusagen, dass die Enter Taste die gleiche Funktion haben würde wie die TAB Taste. Geht das??

danke schon mal
euer HTML


----------



## Redfrettchen (11. Feb 2006)

Hi,
versuch doch im KeyListener den Fokus zu wechseln

```
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER) {
        if (comp1.isFocusOwner()) comp2.requestFocusInWindow();
        else if (comp2.isFocusOwner()) comp1.requestFocusInWindow();
    }
}
```


----------



## html offline (11. Feb 2006)

wie sieht denn der KeyListener gesamt aus??
und wo muss ich den einbinden? 

ich bin noch blutiger anfänger, also bitte ne kurze erklärung,

schon mal danke


----------



## Redfrettchen (11. Feb 2006)

Hallo,
also zum Beispiel im Konstruktor deines Frames (oder JFrames) schreibst du

```
addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER) { 
        if (comp1.isFocusOwner()) comp2.requestFocusInWindow(); 
        else if (comp2.isFocusOwner()) comp1.requestFocusInWindow(); 
    }
}
```

Aber ich weiß nicht, ob das klappt.


----------



## HTML (17. Feb 2006)

hi, es klappt nicht.

Vielleicht kann mir ja jemand so einen KeyListener posten und die funktion krieg ich dann schon selber hin. Ich bräuchte aber den funktionierenden Key Listener sprich das ich auf enter drücke und es passiert was.

danke und merci
aus bavaria


----------



## Illuvatar (17. Feb 2006)

Das ist eigentlich genau, was Redfrettchen geschrieben hat...


----------



## HTML (17. Feb 2006)

und wo schreib ich dann hin, was passieren soll?


----------



## susa. (17. Feb 2006)

```
addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER) 
        {
               //Hier stehen die Ereignisse, die nach Enter ausgeführt werden
        }
}
```


----------



## L-ectron-X (17. Feb 2006)

Hier noch eine Lösung mit ActionListener:

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

public class MyFrame extends JFrame {
  private JTextField tf1, tf2;
  private JLabel lab;
  
  public MyFrame(String title) {
    super(title);
    setSize(250, 100);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    lab = new JLabel("Enter drücken für Focuswechsel");
    lab.setHorizontalAlignment(SwingConstants.CENTER);
    add(lab, BorderLayout.CENTER);
    
    tf1 = new JTextField();
    tf1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        tf2.requestFocus();
      }
    });
    add(tf1, BorderLayout.NORTH);
    
    tf2 = new JTextField();
    tf2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        tf1.requestFocus();
      }
    });
    add(tf2, BorderLayout.SOUTH);
    
    setVisible(true);
  }
  
  public static void main(String[] args) {
    new MyFrame("TextFocus");
  }
}
```


----------



## HTML (17. Feb 2006)

```
addKeyListener(new KeyAdapter() { 
   public void keyPressed(KeyEvent e) { 
   if (e.getKeyCode() == KeyEvent.VK_ENTER) 
       { 
       day.setText("test");
       }
       }});
```

ok, ich musste noch ein paar }s einfügen, sonst kam eine fehlermeldung.
"day" ist ein JTextField, ich mach das nur mal so zum test.
Jetzt hab ich den code von oben direkt in mein JFrame eingefügt.
Also müsste doch wenn ich jetzt Enter drücke auf in meinem TextField der Text "test" erscheinen ??
tut er aber nicht. 
muss ich noch irgendwas zusätzlich reinschreiben, oder so??
danke schon mal 

mfg html


----------



## HTML (25. Feb 2006)

hi, also ich hab jetzt mal die lösung von L-ectron-X genommen, jetzt wollte ich aber in den ActionListener unter actionPerformed noch ein paar andere Funktionen mit einbauen.

z.B. will ich auch noch dass wenn man enter drückt mit setText ein JLabel verändert wird, da des jetzt nicht geht und der KeyListener auch nicht, bräucht ich noch n bisschen hilfe.
Is an dem Listener was falsch den ich als letztes gepostet hab?
Muss ich ihn ins JFrame positioniern, oder?

oder wieso funktioniert des nicht wenn ich beim beispiel von L-ectron-X das label lab verändern will??


----------



## HTML (25. Feb 2006)

unter "tf2.requestFocus(); "
hab ich geschrieben 

lab.setText("test");

funzt aber net

danke für eure antworten


----------



## L-ectron-X (25. Feb 2006)

Das geht bei mir. Musst schon genauer sagen, was nicht funktioniert.

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

public class MyFrame extends JFrame {
  private JTextField tf1, tf2;
  private JLabel lab;
  
  public MyFrame(String title) {
    super(title);
    setSize(250, 100);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    lab = new JLabel("Enter drücken für Focuswechsel");
    lab.setHorizontalAlignment(SwingConstants.CENTER);
    add(lab, BorderLayout.CENTER);
    
    tf1 = new JTextField();
    tf1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
              tf2.requestFocus();
              lab.setText("Focus: tf2");
      }
    });
    add(tf1, BorderLayout.NORTH);
    
    tf2 = new JTextField();
    tf2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
              tf1.requestFocus();
              lab.setText("Focus: tf1");
      }
    });
    add(tf2, BorderLayout.SOUTH);
    
    setVisible(true);
  }
  
  public static void main(String[] args) {
    new MyFrame("TextFocus");
  }
}
```


----------



## HTML (27. Feb 2006)

also bei mir is das so:


```
class TextFrame extends JFrame {
	  	  
	  private JLabel label;
	  	  
    public TextFrame(){
    	
    day = new JTextField(""); 
    day.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
        month.requestFocus(); 
      } 
    }); 
    add(day, BorderLayout.NORTH); 
    
    month = new JTextField(""); 
    month.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
        day.requestFocus();
        label.setText("test");
      } 
    }); 
    add(month, BorderLayout.SOUTH);
```

Das Label steht in einer anderen Class und einem anderen Fenster 

siehe:


```
class NAVIpanel extends JPanel
{	
	public NAVIpanel()
	{
	JLabel label = new JLabel("")
                add(label);
}
}
```

das kompilieren geht einwandfrei, aber wenn ich dann ENTER drücke kommt in der Kommandoebene ein Fehler
( Exception in thead "AWT EventQueue 0" java.lang.NullPionterException
at...
....
...

ziemlich lang :###


----------



## L-ectron-X (27. Feb 2006)

Die NullPointerException bekommst du, weil du das JLabel in der Klasse TextFrame nicht instanziierst, sondern nur eine Instanzvariable davon deklarierst. Im Programmverlauf soll dann auf diesem JLabel ein Text angezeigt werden...
Du greifst auf etwas zu, was nicht da ist.

Wenn dein JLabel in einer anderen Klasse liegt, brauchst du eine Referenz auf diese Klasse (NAVIpanel) und eine Methode in dieser Klasse, die den Text entgegen nimmt und auf das JLabel schreibt.
Dann kannst du den Text an die Methode der Klasse NAVIpanel übergeben.


----------



## HTML (3. Mrz 2006)

Erstmal danke für die gute Erklärung, aber wie schaut denn so eine Referenz aus??
wenn mir das noch jemand posten könnte bin ich wirklich einen großen schritt weiter.

merci und ciao


----------



## L-ectron-X (3. Mrz 2006)

Schau mal in die FAQ: Zugriff: von einem Objekt zum Anderen
Ein einfaches Beispiel ist das Beispiel 1 unter _Variante Referenzübergabe_.


----------



## HTML (4. Mrz 2006)

es will net so richtig funktioniern, was setzt man denn in meinem Fall für Produkt produkt bzw. hersteller ein??


----------



## HTML (7. Mrz 2006)

so, ich hab des jetzt ausprobiert, soweit bin ich:

Die Klasse NAVIpanel ist ein JPanel - mein Hersteller - , in diesem Panel erzeuge ich das JLabel lab --> mein produkt.

```
class NAVIpanel extends JPanel {			

private labi lab;
private String name;

    lab = new labi(this);
	
    public String getName() {
     return name;
}	
}
```
das war jetzt quasi der code in meiner Hersteller-Klasse. soweit richtig?

achja: das JPanel NAVIpanel habe ich so erzeugt:           new JPanel panel3 = NAVIpanel();

meine Produkt-Klasse is die hier:

```
class labi extends JLabel{
  private NAVIpanel panel3;
	
  public labi(NAVIpanel panel3){
  this.panel3 = panel3;
  }
	
  public String getHerstellerName() {
  panel3.getName();
  }
}
```

biem kompilieren bekomme ich nur einen Fehler :

in der Zeile lab= new labi(this);
der Fehler heißt "<identifier> expected"

hab ich das ganze richtig umgesetzt oder total daneben gelangt?
und wieso kommt der fehler? thx und noch eins,
wie nennt man denn so was, weil ich "Referenzen" in meinem Buch nicht gefunden hab.

gut nacht


----------



## L-ectron-X (7. Mrz 2006)

Die Zeile 7 Deiner Klasse NAVIpanel gehört in den Konstruktor.
Im Moment steht sie im leeren Raum. Die Anweisung in Zeile 7 funktioniert nur, wenn sie innerhalb einer Methode steht.

Referenzen sind Zeigervariablen, die auf Objekte bzw. Instanzen im Heap (Speicherbereich für Objekte in der VM) zeigen.
Wenn Du Datei-Verknüpfungen von Windows kennst, so ungefähr kann man auch Referenzen betrachten.

In welcher Klasse befindet sich denn dein JLabel? Diese Klasse hat den Zugriff auf dein JLabel und kann somit den Text entgegennehmen und auf das JLabel schreiben.


----------



## HTML (9. Mrz 2006)

mein JLabel steht in NAVIpanel. Diese Klasse ist das Panel auf dem das JLabel stehen soll. von einer ganz anderen klasse aus( nämlich TextFrame ) soll jetzt ein text da drauf geschrieben werden. geht das dann überhaupt?


----------



## L-ectron-X (9. Mrz 2006)

Ja klar, nur in welchem Verhältnis stehen die Klassen zueinander?
Kennt die Klasse TextFrame die Klasse NAVIPanel bzw. hat die Klasse TextFrame eine Instanz von NAVIPanel?
Wenn wir das geklärt haben, kann ich dir hoffentlich sagen, wie du dein Ziel erreichst.

Wenn NAVIPanel in TextFrame bekannt ist, braucht NAVIPanel im Prinzip nur eine Methode, die den Text entgegennimmt und aufs JLabel schreibt.

```
//Methode in NAVIPanel
public void setTextOnMyLabel(String text) {
   myLabel.setText(text);
}
```

In der Klasse TextFrame übergibst du den Text:

```
NAVIPanel naviPanel;
[...]

//irgendwo in TextFrame
naviPanel.setTextOnMyLabel("So einfach geht das!");
```


----------



## HTML (12. Mrz 2006)

nein, sie ist nicht bekannt, des ist ja des problem, oder??

NAVIPanel ist ein Panel von einem ganz anderem JFrame.

In TextFrame sind die beiden JTextFields die den Focus wechseln ( auch von dir ) und dabei würd ich gern den Inhalt von dem JLabel in 
NAVIPanel ändern.


----------



## L-ectron-X (13. Mrz 2006)

Wo wird denn der "ganz andere Frame" verwendet? Steht dieser Frame mit dem TextFrame irgendwie in Verbindung?
Öffnet bspw. der eine Frame den anderen?


----------



## HTML (13. Mrz 2006)

```
public class KSAVE {
    
    public static void main(String[] args) {

        TextFrame frame1 = new TextFrame();
        frame1.setVisible(true);

		TestFrame frame3 = new TestFrame();
		frame3.setVisible(true);
    }
}
```

das ist die main-class in dem die beiden Fenster erzeugt werden, ansonsten laufen sie ohne verbindung.


----------



## L-ectron-X (13. Mrz 2006)

Dann kann man das so machen:

```
public class KSAVE { 
    
    public static void main(String[] args) {
        AndererFrame andererFrame = new AndererFrame(); 
        andererFrame.setVisible(true); 

        TextFrame textFrame = new TextFrame(andererFrame); 
        textFrame.setVisible(true);  
    } 
}
```




```
public class TextFrame extends JFrame {
   private AndererFrame frame;
   [...]
 
   public TextFrame(AndererFrame frame) {
      this.frame = frame;
      [...]
   }

   private void setTextOnLabel(String text) { 
      frame.setTextOnLabel(text);
   }

   [...]
}
```




```
public class AndererFrame extends JFrame {
   [...]

   public void setTextOnLabel(String text) { 
      label.setText(text); // JLabel auf dem NAVIPanel
   }

   [...]
}
```


----------



## HTML (13. Mrz 2006)

so ich hab jetzt alles genauso gemacht, außer das bei mir die Klassen nicht alle public sind ( TextFrame und AndererFrame sind nicht ).
Muss des sein ? 
dann bekomm ich beim kompilieren auch noch den Fehler, dass er in zeile 5 ( 3. codefeld bei dir ) "label" bzw. wie es bei mir heißt "lab" nicht findet. Wenn ich dann noch 
private JLabel lab; 
hinzufüge, krieg ich wieder die alte NullPointerException

des einzige was möglicherweise falsch ist, ist eigentlich des mit den public Klassen.
jetzt probier ichs mal mit public klassen ...


----------



## L-ectron-X (13. Mrz 2006)

Ohne deinen vollständigen Code werden wir das wohl nicht hinbekommen.
Hast du wenigstens verstanden, was ich mit meinen Zeilen bezwecke?


----------



## HTML (13. Mrz 2006)

funzt net, naja ich werds nochmal überprüfen, aber eigentlich hab ich alles 1:1 übernommen und bloß die Namen ausgetauscht.  :###


----------



## HTML (13. Mrz 2006)

is des eigentlich absicht, dass du im 2. code nicht 

```
private AndererFrame andererFrame;
```
sondern

```
private AndererFrame frame;
```
nimmst?

sonst hab ichs schon so grob verstanden, glaub ich, danke. :idea:


----------



## L-ectron-X (14. Mrz 2006)

Ich hab nur einmal _private AndererFrame frame;_.
Aber ich weiß schon was du meinst.

Es handelt sich hier nur um einen Namen für eine Referenz auf ein Objekt vom Typ AndererFrame.
Mit welchem Namen du die nach Übergabe der Referenz im Konstruktor speicherst bleibt dir überlassen.

Und so funktioniert auch:

```
public class TextFrame extends JFrame { 
   private AndererFrame frame; 
   [...] 

   public TextFrame(AndererFrame andererFrame) { 
      frame = andererFrame; //es ist quasi nur eine Zuweisung einer Speicheradresse der VM
      [...] 
   } 

   private void setTextOnLabel(String text) { 
      frame.setTextOnLabel(text); // Zugriff auf die Instanz von AndererFrame über die Referenz namens "frame"
   } 

   [...] 
}
```


----------

