Tastendruck für UTF-8 Zeichen emulieren

Vailfire

Mitglied
Moin,
ich habe ein eher "großes" Problem. Ich habe mir nämlich zum leichteren Lernen einen komplexen Vokabeltrainer programmiert - Da ich bereits am Dienstag eine Französisch-Klausur und am Mittwoch eine Englisch-Klausur schreibe, bin ich etwas im Zeitdruck :rtfm:

Nunja, ich benötige für die einfache Eingabe von Sonderzeichen (z.B. Ç) ein JFrame mit JButtons, auf denen ich per Action den Inhalt (also das was man per JButton.getText() bekommt) als Tastatureingabe sendet, in meinem Falle als Zeichen für das Eingabefeld.

Nun 2 Probleme:

1. Sonderzeichen gehen nicht
2. Wenn ich das Eingabefeld im Fokus habe und den Button drücke, hat das Eingabefeld nicht mehr den Fokus, d.h. wird die Taste nicht gesendet.

Java:
package de.vailfire.vtrainer;

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JButton;

public class KeyHandler {
 
	String[] keys;
	BufferedReader bf;
	int lines;
	ConfigHandler ch = new ConfigHandler();
	KeyFrame kf;
	
	boolean getKeyBinds(){
		
		if(!ch.fileExistsInDir("keys.char"))ch.downloadFileToDir("http://citybar.square7.ch/keys.char", "keys.char");
		
		
		
		this.lines = 0;
		try {
			this.bf = new BufferedReader(new InputStreamReader( new FileInputStream(ch.getUserDir()+File.separator+"keys.char") , "UTF-8"));
			while (bf.readLine() != null) lines++;
			System.out.println("[KeyHandler] Count of Keys: "+lines);
			if(lines<1)ch.downloadFileToDir("http://citybar.square7.ch/keys.char", "keys.char");
			keys = new String[lines];
			this.bf = new BufferedReader(new FileReader(ch.getUserDir()+File.separator+"keys.char"));
			for(int i = 0; i<keys.length; i++)keys[i]=bf.readLine().substring(0, 1);
			System.out.println("[KeyHandler] keys loaded");
			return true;
			
		} catch (FileNotFoundException e) {
			System.out.println("[KeyHandler] can´t read keys! Error: "+e);
			return false;
		} catch (IOException e) {
			System.out.println("[KeyHandler] IOException while reading the keys! Error: "+e);
			return false;
		}
	}
	
//Ab hier wichtig!
	boolean setKeyBtn(KeyFrame f){
		this.kf=f;
		Rectangle ra;
		
		for(int i=0; i<keys.length; i++){
			System.out.println("[KeyHandler] New key button: "+keys[i]);
			
			final JButton btnc = new JButton(keys[i]);
			btnc.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					char [] chars = btnc.getText().toCharArray();
					try {
						final Robot robo = new Robot();
						robo.keyPress(chars[0]);
					} catch (AWTException e1) {
					}
				
				}});
			kf.add(btnc);
			kf.setVisible(true);
			
		}
		ra = kf.getBounds();
		kf.setBounds(ra.x, ra.y, 90, 28+keys.length*17);
		kf.repaint();
		System.out.println("[KeyHandler] all buttons created");
		return true;
		
		
	}
	
	
}

Ich hoffe auf schnelle Hilfe, meine Zeit eilt wirklich^^

Viele Grüße,
Vailfire
 
Erstelle bitte ein Programm, das fehlerfrei kompilierbar und ausührbar ist.

Bei deinem Code hagelt es bei mir zu 17 Fehlern, die ich echt nicht auch noch lösen möchte.:bahnhof:
 
Na gut, dann poste ich halt 15 Klassen:
Damit du nicht so viel kopieren musst:
citybar.square7.ch/src.zip

Im zip liegt der gesamte Classpath, Images und nicht kompilierte classdateien.

Hoffe das hilft dir weiter,
Grüße Vailfire
 
Ok, ich hab nach längerem Grübeln eine Zwischenlösung gefunden:
Java:
boolean setKeyBtn(KeyFrame f, final JTextField l2){
		this.kf=f;
		Rectangle ra;
		
		for(int i=0; i<keys.length; i++){
			System.out.println("[KeyHandler] New key button: "+keys[i]);
			
			final JButton btnc = new JButton(keys[i]);
			btnc.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					l2.setText(l2.getText()+btnc.getText());
					}
				
				});
			kf.add(btnc);
			kf.setVisible(true);
			
		}
		ra = kf.getBounds();
		kf.setBounds(ra.x, ra.y, 90, 45+keys.length*17);
		kf.repaint();
		System.out.println("[KeyHandler] all buttons created");
		return true;
		
		
	}

Problem: In anderen Bereichen des Vokabeltrainers funktioniert diese Technik nicht, da ich dort mehr als nur ein Eingabefeld habe.

D.h. würde ich mich immer noch über eine Lösung freuen 😀
 
So ganz habe ich dein Programm und dein Problem nicht verstanden..

Ich habe mal zum Textfield ein Popup-Menu definiert, in der ich den Text auswählen kann und dieser dem Text hinzugefügt wird.
Vielleicht ist das ein Ansatz?
Java:
		System.out.println("[Abfrage] Starting review...");
		JPopupMenu popup = new JPopupMenu();
		JMenu subMenu = new JMenu("Keys");
		JMenuItem menuItem = new JMenuItem("Ç");
		menuItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				l2.setText(l2.getText() + "Ç");
			}
		});
		subMenu.add(menuItem);
		popup.add(subMenu);
		l2.add(popup);
		l2.setComponentPopupMenu(popup);
 

Neue Themen


Zurück
Oben