Swing Virtuelle Tastatur mit Accents

mathiasj

Bekanntes Mitglied
Hallo,
ich habe ein Vokabellernprogramm geschrieben, und würde gerne eine Funktion hinzufügen, bei der eine virtuelle Tastatur aufgerufen wird, mit der man Sonderzeichen(wie z.B accents) eingeben kann. Also, wenn z.B. ein Deutscher französisch lernt, dass er dann auch französische Vokabeln eingeben kann. Ist das irgendwie realisierbar?
 
EDIT: Das Einzige, was ich mir bisher vorstellen könnte wäre ein Fenster mit JButtons für jedes Sonderzeichen zu erstellen, dass ich im Internet kopieren kann. Aber das wäre ziemlich viel Arbeit; man müsste für jeden JButton einen ActionListener hinzfügen und co... Habt ihr noch andere Ideen?
 
Und was soll mir das bringen? Ich kann alle accents aus dem Internet kopieren. Aber ich meine, ob es irgendeine vorgefertigte Funktion in Java gibt?
 
Das Einzige, was ich mir bisher vorstellen könnte wäre ein Fenster mit JButtons für jedes Sonderzeichen zu erstellen, dass ich im Internet kopieren kann. Aber das wäre ziemlich viel Arbeit; man müsste für jeden JButton einen ActionListener hinzfügen und co... Habt ihr noch andere Ideen?

Naja...ganz so schlimm stell ich es mir nicht vor...
Einmal ein Layout erstellt, dann eine Map für die verschiedenen Sprachen/Layouts/Beschriftungen...
und ab dafür...
Die Anordnung der *Buttons* verändert sich ja nicht...nur die *Beschriftung* (laut einer Map)
Es reicht auch ein einziger Action-Listener, der dann aber allen Buttons angehängt wird.
Im Action-Performed(Component p_invoker) holst du dir dann einfach den Button-Text vom p_invoker...

Die größte Arbeit ist das *einmalige* Erstellen des Keyboards, das Ändern des Layouts ist am Einfachsten.
 
du musst doch nicht für JEDES zeichen einen button machen ... dafür gibt es doch die sog. key-strokes ... also das eine steuer-taste die belegung einer anderen taste ändern kann ...

wenn man für wirklich JEDES zeichen eine taste hätte bräuchte man kein SHIFT, ALT, STRG, etc ...
und genau so musst du auch arbeiten ...

wenn du also z.b. erkennst das "´" getippt wurde speicherst du dir das und ersetzt dann den nächsten buchstaben , z.b. "e" durch den passenden mit accent : "é" ... genau wie es der tastatur-treiber selbst macht wenn man erst einmal "´" drückt und dann e : é ...

natürlich kann man mit nem deutschen layout nicht alle zeichen der französichen sprache darstellen ... siehe nur dieses komische C mit dem haken unten dran ... aber dafür gibts ja die uni-code tabelle ... und java selbst arbeitet eh mit UTF-8 ... du kannst also einfach "\uhhhh" im source nutzen ...
 
OK, danke für die vielen Vorschläge! Ich habe jetzt aber etwas gefunden, was eig. funktionieren müsste:

Java:
class Tastatur extends JFrame {
    String sonderzeichen = "ùûÿàâæçéèêëïîôœ";
    Tastatur() {
      super("Sonderzeichen");
      
      for(int i = 0; i < sonderzeichen.length(); i++) {
        String beschriftung = "" + sonderzeichen.charAt(i);
        add(new MeinButton(beschriftung);
      }
    }
    
    class MeinButton extends JButton implements ActionListener {
      MeinButton(String name) {
        super(name);
        addActionListener(this);
      }
      
      public void actionPerformed(ActionEvent e) {
        frage.append(getText());
      }
    }
  }
}

Wenn ich das aber ausführe, bekomme ich nur ein Fenster mit einem einzigen Button ohne Beschriftung, der das ganze Fenster ausfüllt...
 
JFrame hat standardmäßig ein BorderLayout. Ein add() fügt eine Komponente dann in den CENTER Bereich, ein weiteres add() überschreibt dann immer den CENTER Bereich.

Du musst dem contentPane also als erstes mal ein richtiges Layout setzen. In deinem Fall würde ich nen FlowLayout verwenden:
Java:
getContentPane().setLayout(new FlowLayout());
 
[JAVA=7] String beschriftung = "" + sonderzeichen.charAt(i);[/code]

wenn ich sowas schon wieder sehe ...
ganz erlich ... nutzt hier String.substring(i, i+1) ... das liefert einen String ... und erspart dir die concation ... denn diese wird vom compiler nämlich so umgesetzt :
Java:
String beschriftung=(new StringBuilder()).append("").append(sonderzeichen.charAt(i)).toString();
und das ist einfach nur bad code ...
 

Zurück
Oben