# Virtuelle Tastatur



## Schräger Vogel (28. Aug 2007)

MMh i hab glaub meine Frage doof erläutert. Wie bastelt man mit Java eine *virtuelle Tastatur* also *so ne Art Touchpad Tastatur *wen nman auf die jeweiligen Buchstaben klickt das anschließend in der ComboList der jeweilige Buchstabe angezeigt wird? Ich hoffe ihr wisst wie ich das meine?? 

Grüße


----------



## Fatal Error (28. Aug 2007)

meinst du ne bildschirmtastatur? so heißt das ding nämlich 
du brauchst einfach einige buttons und die klasse Robot, schau mal wegen Robot in der api nach.
die klasse hat methoden wie keyPress(KeyCode e);


----------



## Wildcard (28. Aug 2007)

Für was soll man bitte den Robot brauchen? :shock:


----------



## Fatal Error (28. Aug 2007)

ich dachte er/sie will eine echte Bildschirmtastaur programmiern, damit man damit auch in andren fensten schreiben kann.

ich hab soetwas schonmal progranmiert...pn für den source code


----------



## Schräger Vogel (28. Aug 2007)

Ja im Prinzip will ich eine Tastatur programmieren die aus den deutshcen Alphabet besteht die ich dann wenn das Programm fertig ist über Touchscreen bedienen kann.Es soll  die Betätigung der Tasten in der JCombobox angezeigt werden.


----------



## Schräger Vogel (28. Aug 2007)

Em um auf deine Frage zurückzukommen ja ich mein eine *Bildschirmtastatur*


----------



## Ariol (29. Aug 2007)

http://www.java-forum.org/de/viewtopic.php?t=54298&highlight=bildschirmtastatur


----------



## Schräger Vogel (29. Aug 2007)

Hi danke für den Post aber wie bekommt man diesen sichtbar ?


----------



## Schräger Vogel (29. Aug 2007)

alos ich hab in der Klasse Keyboard eine Variable erzeugt namens fenster die von JFrame erbt aber trotz allem bleibt der Code unsichtbar sobald ich die Applikation laufen lasse.


----------



## Schräger Vogel (29. Aug 2007)

So das is der Code dazu find weis jemand was daran falsch sein soll? 

CODE:



import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Toolkit;
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton; 
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextField; 




/** 
* Bildschirmtastatur 
* 
*/ 
public class Keyboard extends JPanel 
{    
   JTabbedPane tab = new JTabbedPane(); 
   private static JFrame fenster;
   static JTextField textField; 

   //Die einzelnen Panel fuer die Buttons 
   JPanel bigKeysPanel    = new JPanel(); 
   JPanel smallKeysPanel    = new JPanel(); 
   JPanel numbersPanel    = new JPanel(); 
   JPanel symbolsPanel      = new JPanel(); 
   JPanel specialsPanel   = new JPanel(); 

   //Namen fuer die Buttons 
   String[] bigKeys       = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","\u00C4","\u00D6","\u00DC"}; 
   String[] smallKeys       = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u00E4","\u00F6","\u00FC"}; 
   String[] numbers       = {"1","2","3","4","5","6","7","8","9","0"}; 
   String[] symbols       = {"\u00B0","^","!","\"","\u20AC","$","%","&","\u00DF","(",")","=","?","\u00B4","`","+","-","*","/","#","_","~","\u0040","\u0023","\u0027","\u00B2","\u00B3","{","}","[","]","\\"}; 
   String[] specials      = {"Gross","Klein","Zahlen","Symbole","Backspace","Feld loeschen"}; 

   /** 
    * Bildschirmtastatur 
    * 
    * @param width Breite 
    * @param height Hoehe 
    */ 
   public Keyboard(int width, int height, JTextField textField) 
   {    

      //Textfield bernehmen 
      this.textField = textField; 

      //Groesse einstellen 
      setPreferredSize(new Dimension(width, height)); 

      //Layout und Groesse fuer specialsPanel setzen 
      specialsPanel.setLayout(new GridLayout(1,2)); 

      specialsPanel.setPreferredSize(new Dimension(getPreferredSize().width, 50)); 

      //Layouts setzen 
      bigKeysPanel.setLayout(new GridLayout(3,10)); 
      smallKeysPanel.setLayout(new GridLayout(3,10)); 
      numbersPanel.setLayout(new GridLayout(1,10)); 
      symbolsPanel.setLayout(new GridLayout(3, 11)); 


      //Placement und Groesse fuer tab setzen 
      tab.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 60)); 

      tab.setTabPlacement(JTabbedPane.EAST); 

      //Schriften 
      Font font1 = new Font("Arial",Font.BOLD,15); 
      Font font2 = new Font("Arial",Font.BOLD,11); 

      /* 
       * Tasten mit Bezeichnung, Name und ActionListener versehen 
       * und zu den entsprechenden Panels hinzufuegen 
       */ 
      for(int i = 0; i < bigKeys.length; i++) 
      { 
         JButton button = new JButton(bigKeys_); 
         button.setFont(font1); 
         button.setName(bigKeys); 
         button.addActionListener(new Action()); 
         bigKeysPanel.add(button); 
      } 

      for(int i = 0; i < smallKeys.length; i++) 
      { 
         JButton button = new JButton(smallKeys); 
         button.setFont(font1); 
         button.setName(smallKeys); 
         button.addActionListener(new Action()); 
         smallKeysPanel.add(button); 
      } 

      for(int i = 0; i < numbers.length; i++)    
      { 
         JButton button = new JButton(numbers); 
         button.setFont(font1); 
         button.setName(numbers); 
         button.addActionListener(new Action()); 
         numbersPanel.add(button); 
      } 

      for(int i = 0; i < symbols.length; i++) 
      { 
         JButton button = new JButton(symbols); 
         button.setFont(font1); 
         button.setName(symbols); 
         button.addActionListener(new Action()); 
         symbolsPanel.add(button); 
      } 

      for(int i = 0; i < specials.length; i++) 
      { 
         JButton button = new JButton(specials); 
         button.setFont(font2); 
         button.setName(specials); 
         button.addActionListener(new SpezialAction()); 
         specialsPanel.add(button); 
      } 

      //Panels zu tab hinzufuegen 
      tab.addTab("Gross",bigKeysPanel); 
      tab.addTab("Klein", smallKeysPanel); 
      tab.addTab("Zahlen", numbersPanel); 
      tab.addTab("Symbole", symbolsPanel); 

      add(specialsPanel); 
      add(tab); 

   } 

   public void setTextField(JTextField textField) 
   { 
      this.textField = textField; 
   } 

   /** 
    * Aktionen Eingabe 
    * 
    * @author sikraemer 
    * 
    */ 
   private class Action implements ActionListener 
   { 
      public void actionPerformed(ActionEvent evt) 
      { 
         //Eingabe an den Text im Passworteingabefeld anhaengen 
         String text = textField.getText(); 
         text = text + ((JButton)evt.getSource()).getName(); 
         textField.setText(text); 
      } 
   } 

   /** 
    * Aktionen nicht Eingabe 
    * 
    * @author sikraemer 
    * 
    */ 
   private class SpezialAction implements ActionListener 
   { 
      public void actionPerformed(ActionEvent evt) 
      { 
         // tab umschalten 
         if(((JButton)evt.getSource()).getName().equals("Gross")) 
         { 
            tab.setSelectedComponent(bigKeysPanel); 
         } 
         else if(((JButton)evt.getSource()).getName().equals("Klein")) 
         { 
            tab.setSelectedComponent(smallKeysPanel); 
         } 
         else if(((JButton)evt.getSource()).getName().equals("Zahlen")) 
         { 
            tab.setSelectedComponent(numbersPanel); 
         } 
         else if(((JButton)evt.getSource()).getName().equals("Symbole")) 
         { 
            tab.setSelectedComponent(symbolsPanel); 
         } 
         //Von hinten loeschen 
         else if(((JButton)evt.getSource()).getName().equals("Backspace")) 
         { 
            String text = textField.getText(); 
            if(text.length() > 0) 
            { 
               text = text.substring(0, text.length()-1); 
            } 
            textField.setText(text); 
         } 
         //Feld loeschen 
         else if(((JButton)evt.getSource()).getName().equals("Feld loeschen")) 
         { 
            textField.setText(""); 
         } 
      } 
   } 



// MACH FENSTER sichtbar?

 	public static void main ( String [] args)

 		{

 		fenster = new JFrame(" Tastatur");
 		fenster.pack();
 	 Keyboard keyboard = new Keyboard();
 	 fenster.setVisible(true);
 	 fenster.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 	 fenster.setSize(1000, 800); 



 		}




   import java.awt.BorderLayout; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

import javax.swing.JDialog; 
import javax.swing.JTextField; 

/** 
* Keyboard in einem JDialog 
* als Bildschirmtastatur 
*/ 
public class KeyboardDialog extends JDialog implements FocusListener 
{ 

   private Keyboard keyboard; 


   /** 
    * Erstellt einen KeyboardDialog und zeigt 
    * ihn an. 
    * @param tf - Textfield das den Focus der 
    *                Bildschirmtastatur haben soll 
    */ 
   public KeyboardDialog(JTextField tf) 
   { 
      super(); 
      keyboard = new Keyboard(550, 300, tf); 


      this.setAlwaysOnTop(true); 
      this.add(keyboard,BorderLayout.CENTER); 
      this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      this.setResizable(false); 
      this.setTitle("Display Keyboard"); 
      this.pack(); 
   } 


   /** 
    * Keyboard auf neues Textfield setzen 
    *  
    * @param tf - Textfield das den Focus der 
    *                Bildschirmtastatur haben soll 
    */ 
   public void setNewTextfield(JTextField tf) 
   { 
      keyboard.setTextField(tf); 
   } 


   /** 
    * Setzt Texfeld mit Fokus aktiv fü Bildschirmtastatur 
    */ 
   public void focusGained(FocusEvent fe) 
   { 
      if ((fe.getSource() instanceof JTextField)) 
      { 
         keyboard.setTextField((JTextField)fe.getSource()); 
      } 
   } 


   public void focusLost(FocusEvent fe) 
   { /* nicht implementiert */   } 
} 















}_


----------



## Ariol (29. Aug 2007)

Schräger Vogel hat gesagt.:
			
		

> alos ich hab in der Klasse Keyboard eine Variable erzeugt namens fenster die von JFrame erbt aber trotz allem bleibt der Code unsichtbar sobald ich die Applikation laufen lasse.



??? Das musst du garnicht, dafür gibts ja das Dialog-Fenster



> Einfach einen neuen Keyboard-Dialog erstellen und als Parameter das entsprechende Textfield mitgeben.
> 
> 
> > einfach dort wo dus öffnen willst ein "new KeyboardDialog(Hier dein JTextfield)" einfügen
> ...


----------



## Schräger Vogel (29. Aug 2007)

Das is mir ziemlich peinlich sorry aber was is ein Keyboard Dialog??  Hab leider in Vorlesungen immer mit JFrame gearbeitet deswegen is mir das ganze ziemlich schleierhaft weil wenn nich den Code sowie du es geschickt hast in Eclipse einsetze un anschließend auf ausführen wähle passiert nix? 

Wie meinst du das denn genau wäre echt hilfreich und nochmals danke das du geantwortet hast!


----------



## Schräger Vogel (29. Aug 2007)

Weis niemand wie ich den obigen Code in einme Fenster anzeigne lassen kann? Ich find den Fehler nicht ?


----------



## merlin2 (29. Aug 2007)

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

public class KeyboardTest extends JFrame {
  static JTextField jtf = new JTextField();
  public KeyboardTest (String Title) {
    super (Title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing (WindowEvent evt) {System.exit(0);}});
    setSize(500, 50);
    jtf.setText("Text");
    add(jtf);
  }
  public static void main (String args[]) {
    new KeyboardTest("Bildschirmtatstatur").setVisible(true);
    new KeyboardDialog(jtf).setVisible(true);
  }
}
```


----------



## Ariol (29. Aug 2007)

Also, der ursprüngliche Code besteht aus 2 Klassen:

Keyboard und KeyboardDialog

Der KeyboardDialog erbt von einem JDialog
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JDialog.html

Du musst also diese beiden Klassen anlegen, und kannst dann in deinem Code mit dem Aufruf 

```
KeyboardDialog keyboardDialog = new KeyboardDialog(parameter)
```
aufrufen. dabei öffnet sich dann ein neues Fenster, das die Bildschirmtastatur beinhaltet und sich immer im Vordergrund hält.

Als Parameter gibst du das zu verwendende JTextfield mit.


Wenn du das Ganze mit anderen Komponenten verwenden willst, musst du den Code natürlich abändern. Z.B. statt JTextfield JCombobox einsetzen oder auch die Methoden setText und getText abändern.


----------



## Ariol (29. Aug 2007)

Falls du dir den KeyboardDialog nur mal testen willst, einfach das hier benutzen.


```
public class Test extends JFrame
{
public static void main(String args)
{
Test t1 = new Test();
JTextfield tf1 = new JTextfield();

t1.add(tf1);
t1.pack();

t1.setVisible(true);
t1.setDefaultCloseOperation(EXIT_ON_CLOSE);

new KeyboardDialog(tf1);
}
}
```

Die imports sind jetzt nicht drin, ich hab das schnell von Hand hier rein geschrieben


----------



## Schräger Vogel (29. Aug 2007)

An welcher Stelle soll das den stehn in der Klasse JDialog danke für deinen Post bin echt froh!!! : 
*KeyboardDialog keyboardDialog = new KeyboardDialog(parameter) *
Weil normalerweise benutzt man ja immer die Main-Methode um das Fenster sichtbar zu machen deswegen irritiert mich das einwenig soll i da eine Main-Methode einfügen?

import java.awt.BorderLayout; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

import javax.swing.JDialog; 
import javax.swing.JTextField; 

/** 
* Keyboard in einem JDialog 
* als Bildschirmtastatur 
*/ 
public class KeyboardDialog extends JDialog implements FocusListener 
{ 

   private Keyboard keyboard; 


   /** 
    * Erstellt einen KeyboardDialog und zeigt 
    * ihn an. 
    * @param tf - Textfield das den Focus der 
    *                Bildschirmtastatur haben soll 
    */ 
   public KeyboardDialog(JTextField tf) 
   { 
      super(); 
      //keyboard = new Keyboard(550, 300, tf); 


      this.setAlwaysOnTop(true); 
      this.add(keyboard,BorderLayout.CENTER); 
      this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      this.setResizable(false); 
      this.setTitle("Display Keyboard"); 
      this.pack(); 
   } 


   /** 
    * Keyboard auf neues Textfield setzen 
    *  
    * @param tf - Textfield das den Focus der 
    *                Bildschirmtastatur haben soll 
    */ 
   public void setNewTextfield(JTextField tf) 
   { 
      keyboard.setTextField(tf); 
   } 


   /** 
    * Setzt Texfeld mit Fokus aktiv fü Bildschirmtastatur 
    */ 
   public void focusGained(FocusEvent fe) 
   { 
      if ((fe.getSource() instanceof JTextField)) 
      { 
         keyboard.setTextField((JTextField)fe.getSource()); 
      } 
   } 


   public void focusLost(FocusEvent fe) 
   { /* nicht implementiert */   } 
}


----------



## Ariol (29. Aug 2007)

Teste mal den Code hier erst aus


```
public class Test extends JFrame 
 { 
 public static void main(String args) 
 { 
 Test t1 = new Test(); 
 JTextfield tf1 = new JTextfield(); 
 JTextfield tf2 = new JTextfield(); 
 
 t1.add(tf1);  
 t1.add(tf2); 
 t1.pack(); 
 
 t1.setVisible(true); 
 t1.setDefaultCloseOperation(EXIT_ON_CLOSE); 
 
new KeyboardDialog(tf1); //<--Hier wird der Dialog angelegt
 } 
 }
```


Wenns mit dem umschalten zwischen den Textfeldern (einfach reinklicken sollte glaube ich ausreichen) nicht klappt einfach nochmal schreiben. Es ist schon eine zeitlang her, das ich das Ding geschrieben/benutzt habe.

Zum Testen des Ganzen:

du brauchts: 3 Klassen:

*Keyboard:*

```
import java.awt.Dimension; 
 import java.awt.Font; 
 import java.awt.GridLayout; 
 import java.awt.event.ActionEvent; 
 import java.awt.event.ActionListener; 
 
 import javax.swing.JButton; 
 import javax.swing.JPanel; 
 import javax.swing.JTabbedPane; 
 import javax.swing.JTextField; 
 
 
 /** 
 * Bildschirmtastatur 
 * 
 */ 
 public class Keyboard extends JPanel 
 {    
    JTabbedPane tab = new JTabbedPane(); 
     
    JTextField textField; 
     
    //Die einzelnen Panel fuer die Buttons  
    JPanel bigKeysPanel    = new JPanel(); 
    JPanel smallKeysPanel    = new JPanel(); 
    JPanel numbersPanel    = new JPanel(); 
    JPanel symbolsPanel      = new JPanel(); 
    JPanel specialsPanel   = new JPanel(); 
     
    //Namen fuer die Buttons 
    String[] bigKeys       = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","\u00C4","\u00D6","\u00DC"}; 
    String[] smallKeys       = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u00E4","\u00F6","\u00FC"}; 
    String[] numbers       = {"1","2","3","4","5","6","7","8","9","0"}; 
    String[] symbols       = {"\u00B0","^","!","\"","\u20AC","$","%","&","\u00DF","(",")","=","?","\u00B4","`","+","-","*","/","#","_","~","\u0040","\u0023","\u0027","\u00B2","\u00B3","{","}","[","]","\\"}; 
    String[] specials      = {"Gross","Klein","Zahlen","Symbole","Backspace","Feld loeschen"}; 
     
    /** 
     * Bildschirmtastatur 
     * 
     * @param width Breite 
     * @param height Hoehe 
     */ 
    public Keyboard(int width, int height, JTextField textField) 
    {    
     
       //Textfield bernehmen 
       this.textField = textField; 
        
       //Groesse einstellen 
       setPreferredSize(new Dimension(width, height)); 
        
       //Layout und Groesse fuer specialsPanel setzen 
       specialsPanel.setLayout(new GridLayout(1,2)); 
        
       specialsPanel.setPreferredSize(new Dimension(getPreferredSize().width, 50)); 
        
       //Layouts setzen 
       bigKeysPanel.setLayout(new GridLayout(3,10)); 
       smallKeysPanel.setLayout(new GridLayout(3,10)); 
       numbersPanel.setLayout(new GridLayout(1,10)); 
       symbolsPanel.setLayout(new GridLayout(3, 11)); 
        
        
       //Placement und Groesse fuer tab setzen 
       tab.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 60)); 
        
       tab.setTabPlacement(JTabbedPane.EAST); 
        
       //Schriften 
       Font font1 = new Font("Arial",Font.BOLD,15); 
       Font font2 = new Font("Arial",Font.BOLD,11); 
        
       /* 
        * Tasten mit Bezeichnung, Name und ActionListener versehen 
        * und zu den entsprechenden Panels hinzufuegen 
        */ 
       for(int i = 0; i < bigKeys.length; i++) 
       { 
          JButton button = new JButton(bigKeys[i]); 
          button.setFont(font1); 
          button.setName(bigKeys[i]); 
          button.addActionListener(new Action()); 
          bigKeysPanel.add(button); 
       } 
        
       for(int i = 0; i < smallKeys.length; i++) 
       { 
          JButton button = new JButton(smallKeys[i]); 
          button.setFont(font1); 
          button.setName(smallKeys[i]); 
          button.addActionListener(new Action()); 
          smallKeysPanel.add(button); 
       } 
        
       for(int i = 0; i < numbers.length; i++)    
       { 
          JButton button = new JButton(numbers[i]); 
          button.setFont(font1); 
          button.setName(numbers[i]); 
          button.addActionListener(new Action()); 
          numbersPanel.add(button); 
       } 
        
       for(int i = 0; i < symbols.length; i++) 
       { 
          JButton button = new JButton(symbols[i]); 
          button.setFont(font1); 
          button.setName(symbols[i]); 
          button.addActionListener(new Action()); 
          symbolsPanel.add(button); 
       } 
        
       for(int i = 0; i < specials.length; i++) 
       { 
          JButton button = new JButton(specials[i]); 
          button.setFont(font2); 
          button.setName(specials[i]); 
          button.addActionListener(new SpezialAction()); 
          specialsPanel.add(button); 
       } 
        
       //Panels zu tab hinzufuegen 
       tab.addTab("Gross",bigKeysPanel); 
       tab.addTab("Klein", smallKeysPanel); 
       tab.addTab("Zahlen", numbersPanel); 
       tab.addTab("Symbole", symbolsPanel); 
        
       add(specialsPanel); 
       add(tab); 
        
    } 
     
    public void setTextField(JTextField textField) 
    { 
       this.textField = textField; 
    } 
     
    /** 
     * Aktionen Eingabe 
     * 
     * @author sikraemer 
     * 
     */ 
    private class Action implements ActionListener 
    { 
       public void actionPerformed(ActionEvent evt) 
       { 
          //Eingabe an den Text im Passworteingabefeld anhaengen 
          String text = textField.getText(); 
          text = text + ((JButton)evt.getSource()).getName(); 
          textField.setText(text); 
       } 
    } 
     
    /** 
     * Aktionen nicht Eingabe 
     * 
     * @author sikraemer 
     * 
     */ 
    private class SpezialAction implements ActionListener 
    { 
       public void actionPerformed(ActionEvent evt) 
       { 
          // tab umschalten 
          if(((JButton)evt.getSource()).getName().equals("Gross")) 
          { 
             tab.setSelectedComponent(bigKeysPanel); 
          } 
          else if(((JButton)evt.getSource()).getName().equals("Klein")) 
          { 
             tab.setSelectedComponent(smallKeysPanel); 
          } 
          else if(((JButton)evt.getSource()).getName().equals("Zahlen")) 
          { 
             tab.setSelectedComponent(numbersPanel); 
          } 
          else if(((JButton)evt.getSource()).getName().equals("Symbole")) 
          { 
             tab.setSelectedComponent(symbolsPanel); 
          } 
          //Von hinten loeschen 
          else if(((JButton)evt.getSource()).getName().equals("Backspace")) 
          { 
             String text = textField.getText(); 
             if(text.length() > 0) 
             { 
                text = text.substring(0, text.length()-1); 
             } 
             textField.setText(text); 
          } 
          //Feld loeschen 
          else if(((JButton)evt.getSource()).getName().equals("Feld loeschen")) 
          { 
             textField.setText(""); 
          } 
       } 
    } 
 }
```

*KeyboardDialog*

```
import java.awt.BorderLayout; 
 import java.awt.event.FocusEvent; 
 import java.awt.event.FocusListener; 
 
 import javax.swing.JDialog; 
 import javax.swing.JTextField; 
 
 /** 
 * Keyboard in einem JDialog 
 * als Bildschirmtastatur 
 */ 
 public class KeyboardDialog extends JDialog implements FocusListener 
 { 
     
    private Keyboard keyboard; 
     
     
    /** 
     * Erstellt einen KeyboardDialog und zeigt 
     * ihn an. 
     * @param tf - Textfield das den Focus der 
     *                Bildschirmtastatur haben soll 
     */ 
    public KeyboardDialog(JTextField tf) 
    { 
       super(); 
       keyboard = new Keyboard(550, 300, tf); 
        
        
       this.setAlwaysOnTop(true); 
       this.add(keyboard,BorderLayout.CENTER); 
       this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
       this.setResizable(false); 
       this.setTitle("Display Keyboard"); 
       this.pack(); 
    } 
     
 
    /** 
     * Keyboard auf neues Textfield setzen 
     *  
     * @param tf - Textfield das den Focus der 
     *                Bildschirmtastatur haben soll 
     */ 
    public void setNewTextfield(JTextField tf) 
    { 
       keyboard.setTextField(tf); 
    } 
 
 
    /** 
     * Setzt Texfeld mit Fokus aktiv fü Bildschirmtastatur 
     */ 
    public void focusGained(FocusEvent fe) 
    { 
       if ((fe.getSource() instanceof JTextField)) 
       { 
          keyboard.setTextField((JTextField)fe.getSource()); 
       } 
    } 
 
 
    public void focusLost(FocusEvent fe) 
    { /* nicht implementiert */   } 
 }
```

*und Test (Hier fehlen die Imports!!!)*

```
public class Test extends JFrame 
 { 
 public static void main(String args) 
 { 
 Test t1 = new Test(); 
 JTextfield tf1 = new JTextfield(); 
 JTextfield tf2 = new JTextfield(); 
 
 t1.add(tf1);  
 t1.add(tf2); 
 t1.pack(); 
 
 t1.setVisible(true); 
 t1.setDefaultCloseOperation(EXIT_ON_CLOSE); 
 
new KeyboardDialog(tf1); //<--Hier wird der Dialog angelegt
 } 
 }
```


Das ganze Kompilieren und die Test-Klasse ausführen. 
Es sollten jetzt 2 Fenster erscheinen, eines mit 2 Textfeldern und eines mit der Tastatur.
Wenn du auf der Tastatur etwas anklickst wird das entsprechend ins Textfield geschrieben.
Wenn du das 2. Textfield auswählst und dann etwas klickst wird in dieses geschrieben.

(Die Testklasse ist in 2 Minuten entstanden, und hat ein Null-Layout - also nicht besonders schön. es kann auch vorkommen, das du das ganze etwas größer ziehen musst.


----------



## Schräger Vogel (29. Aug 2007)

erstmal *ganz großes LOB an Ariol*

vielen Dank nochmal für deine Hilfe!! 


allerdings klappt es nicht immer wenn ich deine Test Klasse ausführen will erscheint in Eclipse keine Run Application

Imports hab ich alle berücksichtigt:

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

import javax.swing.*;


public class Test extends JFrame 
{ 
public static void main(String args) 
{ 
Test t1 = new Test(); 
JTextField tf1 = new JTextField(); 
JTextField tf2 = new JTextField(); 

t1.add(tf1);  
t1.add(tf2); 
t1.pack(); 

t1.setVisible(true); 
t1.setDefaultCloseOperation(EXIT_ON_CLOSE); 

new KeyboardDialog(tf1); //<--Hier wird der Dialog angelegt 
} 
}


----------



## Ariol (29. Aug 2007)

oh, kleiner Fehler:

Schreib mal statt "public static void main(String args)" "public static void main(String[] args)"  


Danke für das Lob.

Kleiner Tip noch setzt deinen Code doch in 
	
	
	
	





```
-tags - dann ist er besser lesbar.
```


----------



## Schräger Vogel (29. Aug 2007)

Gern geschehn!

Lol ok jetzt lässt es sich übersetzen allerdings kommt jetzt nur ein TextFeld im Fenster ohne das die Tastatur eingeblendet wird. 

Danke für den Tip Code Tags? Wie kann ich das einstellen


----------



## merlin2 (29. Aug 2007)

merlin2 hat gesagt.:
			
		

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





```
setVisible(true);
```
fehlt, übrigens habe ich meine Testklasse vor Ariols gepostet, warum ignorierst du sie einfach? :x  :wink:


----------



## Schräger Vogel (29. Aug 2007)

Hey Merlin net böse sein bin dir natürlich auch dankbar habs erst mal auf die eine Art versucht. 

An dich natürlich auch ein großes LOB!


----------



## merlin2 (29. Aug 2007)

Auch danke für das Lob, ich bin natürlich nicht böse.  
Die Hauptsache ist, dass es jetzt funktioniert.


----------



## Ariol (29. Aug 2007)

So gehts:


```
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.*;

public class Test extends JFrame 
{ 
	 static KeyboardDialog kd1;
	
	 public static void main(String[] args) 
	 { 
		 /*JFrame anlegen*/
		 Test t1 = new Test(); 
		 t1.setLayout(new GridLayout(2,1));
		 t1.setPreferredSize(new Dimension(200,80));
		 		 
		 /*JTextField anlegen*/
		 JTextField tf1 = new JTextField(); 
		 JTextField tf2 = new JTextField();
		 
		 /*FocusListener (wird aufgerufen, wenn in eines der Textfelder geklickt wird*/
		 FocusListener fl1 = new FocusListener()
		 {
			public void focusGained(FocusEvent e) 
			{
				if ((e.getSource() instanceof JTextField)) 
		        { 
		           kd1.setNewTextfield((JTextField)e.getSource()); 
		        } 
			}

			public void focusLost(FocusEvent e) {}
		 };
		 tf1.addFocusListener(fl1);//Listener auf das TextField legen
		 tf2.addFocusListener(fl1);
		 
		 /*JFrame fertigstellen*/
		 t1.add(tf1);  
		 t1.add(tf2); 
		 t1.pack(); 
		 t1.setVisible(true); 
		 t1.setDefaultCloseOperation(EXIT_ON_CLOSE); 
		 
		 /*KeyboardDialog*/
		 kd1 = new KeyboardDialog(tf1); //<--Hier wird der Dialog angelegt 
		 kd1.setVisible(true); //Dialog anzeigen
	 } 
}
```

-----------------------------------------------

Code-Tags:

[ code ] <- vor den Code
[/ code ] <- hinter den Code
ohne die Leerzeichen

---------------------------------------------
EDIT.

@merlin2:

jop, das setVisible hatte ich vergessen,.... ist schon länger her, das ich den kram gemacht hab.
Es haben auch noch die Focuslistener auf den Textfeldern gefehlt...

Naja, ich habs getestet und jetzt gehts


----------



## Xams (30. Aug 2007)

Wenn du die Tastatur für alle Programme nehmen möchtest, musst du statt den Text im Textfield zu verändern, java.awt.Robot verwenden.


----------



## Ariol (30. Aug 2007)

ist schon klar, aber es ging ihm ja nur darum was in eine Combobox zu schreiben. Da hat er meinen Code schneller abgeändert, als sich die Tastatur selbst mit Robot zu schreiben....


----------



## Schräger Vogel (31. Aug 2007)

HI also der Code klappt wunderbar nochmals danke! Jetzt hät ich allerdings ein kleine Frage ist es auch möglich das ganze in ein Fenster einzubauen so das nicht immer 2 Fenster aufgehn. Es müsste doch auch möglich sein in der Klasse  Keyboard das Fenster zu erzeugen so das in dieser sich das Textfeld befindet anstatt eine neue Klasse Test zu erzeugen?


----------



## merlin2 (31. Aug 2007)

Dann musst du eben Keyboard eine main-Methode mit etwa folgendem Inhalt hinzufügen:

```
JFrame f = new JFrame("Titel");
f.setLayout(new BorderLayout());
f.add(eitherAJTextFieldOrAJComboBox, "North");
f.add(new Keyboard(550, 300, eitherAJTextFieldOrAJComboBox), "South");
f.pack();
f.setVisible(true);
```


----------



## Ariol (31. Aug 2007)

Nicht ganz, eher so:

```
JFrame f = new JFrame("Titel"); 
f.setLayout(new BorderLayout()); 

JTextfield textfield = new JTextfield();
Keyboard keyboard = new Keyboard(550, 300, textfield);

FocusListener focusListener = new FocusListener() 
{ 
       public void focusGained(FocusEvent e) 
       { 
             if ((e.getSource() instanceof JTextField)) 
             { 
                  keyboard.setNewTextfield((JTextField)e.getSource()); 
             } 
       }
} 
 

textfield.addFocuslistener(focusListener);

 f.add(textfield,"North"); 
 f.add(keyboard,"South");
 f.pack(); 
 f.setVisible(true);
```


----------



## Schräger Vogel (31. Aug 2007)

So hat geklappt danke vielmals an euch 2!! :toll:


----------

