# Lückentext mit Swingkomponente



## tomkruse (5. Apr 2006)

Hi!

Ich möchte gerne einen Lückentext erzeugen in den man dann (wie man es von Grammatikübungen aus der Schule kennt) gewisse Wörter ergänzen kann. Es sollte allerdings nicht möglich sein, den restlichen Text zu verändern. 

Gibt es eine elegante und einfache Möglichkeit, ohne recht großen Programmieraufwand etwas derartiges zu realisieren? 
Ich könnte mir vorstellen, daß da mit der JEditorPane und der internen Darstellung in HTML vielleicht etwas möglich ist, habe mir auch schon einige Gedanken dazu gemacht, bin aber noch nicht auf eine brauchbare Lösung gestoßen.

Würde mich über Tipps und Hilfe freuen. Danke schon mal im Voraus!

Tom.


----------



## André Uhres (5. Apr 2006)

```
//package schnipsel;
/*
 * Html_Form_2.java
 *
 * Das HTML Formular ist eine interessante Alternative zu einem reinen Swing Formular.
 *
 */
import java.beans.*;
import java.util.*;
import javax.swing.*;
public class Html_Form_2 extends JFrame {
    public Html_Form_2() {
        super("Html Formular");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(700,350);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setLocationRelativeTo(null);
        formular = new HTMLFormular();
        formular.setText(form_text);
        formular.addPropertyChangeListener("data", new PropertyChangeListener(){
            public void propertyChange(PropertyChangeEvent evt) {
                getData();
            }
        });
        getContentPane().add(new JScrollPane(formular));
    }
    private void getData(){
        Map<String, String> result = formular.getResult();
        luecke1 = result.get("luecke1");
        luecke2 = result.get("luecke2");
        JOptionPane.showMessageDialog(this, teilSatz1+luecke1+teilSatz2+luecke2);
    }
    public static void main(String args[]) {new Html_Form_2().setVisible(true);;}
    private HTMLFormular formular;
    private String luecke1, luecke2;
    private String teilSatz1 = "Mein Vorname ist ";
    private String teilSatz2 = " und mein Nachname ist ";
    private String form_text =
            "<form>" +
            "<table>"+
            "<tr>"+
            "       <td>"+teilSatz1+"</td>"+
            "       <td><input name='luecke1'></td>"+
            "       <td>"+teilSatz2+"</td>"+
            "       <td><input name='luecke2'></td>"+
            "</tr>"+
            "<tr>"+
            "       <td></td>"+
            "       <td><input type='submit'></td>"+
            "</tr>"+
            "</table>" +
            "</form>";
}
```


```
//package schnipsel;
/*
 * HTMLFormular.java
 */
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class HTMLFormular extends JEditorPane{
    public HTMLFormular(){
        setEditable(false);
        setEditorKit(new HTMLEditorKit() {
            public ViewFactory getViewFactory() {
                return new HTMLEditorKit.HTMLFactory() {
                    public View create(Element elem) {
                        Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
                        if (o instanceof HTML.Tag) {
                            HTML.Tag kind = (HTML.Tag) o;
                            if (kind == HTML.Tag.INPUT )
                                return new FormView(elem) {
                                    protected void submitData(String data) {
                                        setData(data);
                                    }
                                };
                        }
                        return super.create(elem);
                    }
                };
            }
        });
    }
    private void setData(String data){
        resultMap = new HashMap<String, String>();
        StringTokenizer st = new StringTokenizer(data, "&");
        while (st.hasMoreTokens()) {
            String token = st.nextToken();
            String key = null;
            String value = null;
            try {
                key = URLDecoder.decode(token.substring(0, token.indexOf("=")), "ISO-8859-1");
                value = URLDecoder.decode(token.substring(token.indexOf("=") + 1, token.length()), "ISO-8859-1");
            } catch (UnsupportedEncodingException ex) {
                ex.printStackTrace();
            }
            resultMap.put(key,value);
        }
        firePropertyChange("data", null, data);
    }
    public Map<String, String> getResult() {
        return resultMap;
    }
    private Map<String, String> resultMap;
}
```


----------



## transsib (5. Apr 2006)

@André Uhres

Hallo André!

Ich bin hier noch nicht registiriert, weil ich mich derzeit noch äußerst zäh durch meine diversen
Java-Bücher wurschtle. Allerdings lese ich schon lange Zeit hier im Forum mit und stolpere dabei
ständig über Deine Beiträge und muss schon sagen, dass ich es mehr als nur beachtlich finde
welche Mühe Du Dir immer gibst, auch komplexe Fragen zu beantworten und welche Zeit Du
offensichtlich dafür investierst!

*Respekt!* :applaus: 

Gruß, Oliver


----------



## André Uhres (6. Apr 2006)

transsib hat gesagt.:
			
		

> ...Ich bin hier noch nicht registiriert ... .... ... Respekt! ...


Tut mir leid, Oliver, ein nicht registriertes Lob nehm ich nicht an.
Nein, war nur ein Scherz   . Ich danke dir.

Mir macht die Tätigkeit hier einfach Spass.
Wenn man dann mal gelobt wird, macht's natürlich noch mehr Spass.
Und bei all dem lern ich ja auch noch was hinzu.
Gruß
André


----------



## transsib (6. Apr 2006)

Hab mich doch mal angemeldet, auch wenn ich selbst noch keine Fragen
habe und natürlich auch keine beantworten kann.  :wink:  

Gruß, Oliver


----------



## tomkruse (6. Apr 2006)

Hallo!

Ich möchte mich an dieser Stelle auch mal für die Antwort bedanken. Werde das demnächst ausprobieren und mal sehen wie es aussieht. Auf die Idee, das mit Formularelementen zu machen bin ich noch nicht gekommen ;-)

@André

Du hast das aber nicht extra für die Beantwortung meiner Frage programmiert, oder? Würde mich beinahe verlegen machen, wenn jemand soviel Zeit opfert, nur um mir mal eben zu helfen. 

viele Grüße

Tom.


----------



## André Uhres (6. Apr 2006)

tomkruse hat gesagt.:
			
		

> ...Du hast das aber nicht extra für die Beantwortung meiner Frage programmiert, oder?
> Würde mich beinahe verlegen machen, wenn jemand soviel Zeit opfert, nur um mir mal eben zu helfen...


Wegen der Zeit mach dir mal keine Sorgen. Das Teil ist schliesslich von allgemeinem Nutzen, nicht nur für dich.
Aber du hast recht: das Ding hatte ich schon im Januar gebastelt. Hab's nur hier ein wenig angepasst.
Die Idee hatte ich irgendwo im Internet gefunden und dann ausgebaut.
Hier ist mein Originalpost:
http://www.java-forum.org/de/viewtopic.php?p=161273#161273


----------



## escalator (2. Jul 2008)

Echt cool! Kann man das auch irgendwie machen, wenn das HTML in einem JLabel dargestellt wird?
Oder würdet ihr mir da generell abraten?


----------



## escalator (3. Jul 2008)

Ich habe versucht nun noch den Focus auf das erste Eingabefeld zu setzen, war aber erfolglos. Ich habe dazu ein wenig mit dem Focus Manager herumgespielt, ohne Erfolg. Seltsamerweise hat mir nicht einmal die Methode focusNextComponent() etwas gebracht...obwohl man doch im Beispielprogramm von André mittel einmaligem Drücken der Tab Taste zum ersten Eingabefeld kommt. 
 Falls zufällig das hier jemand liest, wisst ihr dafür eine Lösung?


----------



## André Uhres (3. Jul 2008)

escalator hat gesagt.:
			
		

> Ich habe versucht nun noch den Focus auf das erste Eingabefeld zu setzen, war aber erfolglos..


Versuch's mal so:

```
...
    public Html_Form_2() {
...
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                formular.transferFocus();
            }
        });
    }
...
    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Html_Form_2().setVisible(true);
            }
        });
    }
...
}
```


----------



## escalator (9. Aug 2008)

Vielen, vielen Dank. Ich bin dank euren Tips schon sehr viel weiter. Nun ist mir in Zusammenhang mit dem Html_Form allerdings wieder ein Problem begegnet, ich hoffe dass es sich mit vertretbarem Aufwand lösen lässt:
Ich möchte Eingaben auf das Eingabefeld im HTML-Formular abfangen, und dann eine 'modifizierte Eingabe' an das Eingabefeld weiterleiten. (Um ein Beispiel zu nennen, damit ihr euch nicht wundert was das soll: die Kombination aus AltGr und ß soll in meinem Programm ein umgekehrtes Fragezeichen (¿) ergeben, was ja auf unseren deutschen Tastaturen nicht zu finden ist.) Mein Problem ist nun:
Das Abfangen der Eingaben funktioniert nicht wie gewünscht. Wenn ich dem HTML-Formular einen KeyListener hinzufüge, werden die Ereignisse zwar ausgelöst wenn ich das Formular focussiert habe (nicht das Eingabefeld im Formular!), aber nicht wenn der Focus im Eingabefeld sitzt.   
Ein weiterer versuch mittels 
	
	
	
	





```
HTMLForm1.getComponents()[0].addKeyListener(new KeyListener(){...})
```
 war ebenfalls erfolglos, obwohl bei einem Aufruf von 
	
	
	
	





```
HTMLForm1.getComponents()[0].setVisible(false);
```
 doch tatsächlich das Eingabefeld unsichtbar wird.  :shock:


----------

