Neues Model für JTextField erstellen

Status
Nicht offen für weitere Antworten.

gizmo

Bekanntes Mitglied
Hallo Zussammen!

Ich will für ein JTextField ein neues Model machen. Man übergibt ein Objekt, welches einen String als Attribut hat, mit entsprechenden gettern/settern und den Namen des Attributs. Nun soll dieses Objekt verwendet werden, um die Eingaben des Textfelds zu speichern. Dies funktioniert leider noch nicht ganz, es wird nur ein Zeichen angezeigt und die Reihenfolge der Eingaben stimmt auch nicht.

Vielleicht sieht jemand von euch den Überlegungsfehler...

Hier mein Code:
Code:
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Vector;
import javax.swing.text.*;
import javax.swing.undo.*;

public class ContentAdapter
    implements javax.swing.text.AbstractDocument.Content
{
    class MyPosition
        implements Position
    {

        public int getOffset()
        {
            return position;
        }

        private int position;

        public MyPosition(int position)
        {
            this.position = position;
        }
    }

    class InsertUndo extends AbstractUndoableEdit
    {

        public void undo()
            throws CannotUndoException
        {
            super.undo();
            try
            {
                string = getString(offset, length);
                remove(offset, length);
            }
            catch(BadLocationException bl)
            {
                throw new CannotUndoException();
            }
        }

        public void redo()
            throws CannotRedoException
        {
            super.redo();
            try
            {
                insertString(offset, string);
                string = null;
            }
            catch(BadLocationException bl)
            {
                throw new CannotRedoException();
            }
        }

        protected int offset;
        protected int length;
        protected String string;

        protected InsertUndo(int offset, int length)
        {
            this.offset = offset;
            this.length = length;
        }
    }

    class RemoveUndo extends AbstractUndoableEdit
    {

        public void undo()
            throws CannotUndoException
        {
            super.undo();
            try
            {
                insertString(offset, string);
                string = null;
            }
            catch(BadLocationException bl)
            {
                throw new CannotUndoException();
            }
        }

        public void redo()
            throws CannotRedoException
        {
            super.redo();
            try
            {
                string = getString(offset, length);
                remove(offset, length);
            }
            catch(BadLocationException bl)
            {
                throw new CannotRedoException();
            }
        }

        protected int offset;
        protected int length;
        protected String string;
        protected Vector posRefs;

        protected RemoveUndo(int offset, String string)
        {
            this.offset = offset;
            this.string = string;
            length = string.length();
        }
    }


    public ContentAdapter(Object anObject, String aPropertyName)
        throws IllegalParameterException
    {
        model = null;
        getter = null;
        setter = null;
        String getterName = "get" + aPropertyName;
        try
        {
            getter = anObject.getClass().getMethod(getterName, null);
            if(!java.lang.String.class.isAssignableFrom(getter.getReturnType()))
                throw new IllegalParameterException("Methode " + getterName + " in " + anObject.getClass() + " liefert keinen String");
        }
        catch(SecurityException e)
        {
            e.printStackTrace();
            throw new IllegalParameterException("Kein Zugriff auf " + getterName + " in " + anObject.getClass());
        }
        catch(NoSuchMethodException e)
        {
            e.printStackTrace();
            throw new IllegalParameterException("Methode " + getterName + " nicht in " + anObject.getClass() + " vorhanden");
        }
        String setterName = "set" + aPropertyName;
        try
        {
            Class parameters[] = {
                java.lang.String.class
            };
            setter = anObject.getClass().getMethod(setterName, parameters);
        }
        catch(SecurityException e)
        {
            e.printStackTrace();
            throw new IllegalParameterException("Kein Zugriff auf " + setterName + " in " + anObject.getClass());
        }
        catch(NoSuchMethodException e)
        {
            e.printStackTrace();
            throw new IllegalParameterException("Methode " + setterName + " nicht in " + anObject.getClass() + " vorhanden");
        }
        model = anObject;
    }

    public String get()
    {
        try
        {
            String ret = (String)getter.invoke(model, null);
            return ret == null ? "" : ret;
        }
        catch(IllegalArgumentException e)
        {
            e.printStackTrace();
        }
        catch(IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch(InvocationTargetException e)
        {
            e.printStackTrace();
        }
        return "";
    }

    public void set(String newString)
    {
        try
        {
            setter.invoke(model, new Object[] {
                newString != null ? newString : ""
            });
        }
        catch(IllegalArgumentException e)
        {
            e.printStackTrace();
        }
        catch(IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch(InvocationTargetException e)
        {
            e.printStackTrace();
        }
    }

    public int length()
    {
        return get().length();
    }

    public String getString(int aWhere, int aLen)
        throws BadLocationException
    {
        return get().substring(aWhere, aWhere + aLen);
    }

    public Position createPosition(int anOffset)
        throws BadLocationException
    {
        return new MyPosition(anOffset);
    }

    public void getChars(int aWhere, int aLen, Segment aTxt)
        throws BadLocationException
    {
        int end = aWhere + aLen;
        if(aWhere < 0 || end < 0)
            throw new BadLocationException("Invalid location", -1);
        if(end > length() || aWhere > length())
            throw new BadLocationException("Invalid location", length() + 1);
        try
        {
            aTxt.array = get().substring(aWhere, aWhere + aLen).toCharArray();
            aTxt.offset = aWhere;
            aTxt.count = aLen;
            System.out.println(getClass().getName() + ": " + aTxt.count);
            System.out.print(getClass().getName() + ": ");
            for(int i = 0; i < aTxt.count; i++)
                System.out.print(aTxt.array[i]);

            System.out.println();
            System.out.println(getClass().getName() + ": " + get());
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public UndoableEdit remove(int offset, int length)
        throws BadLocationException
    {
        set((new StringBuffer(get())).replace(offset, offset + length, "").toString());
        return new RemoveUndo(offset, get().substring(offset, offset + length));
    }

    public UndoableEdit insertString(int aWhere, String aStr)
        throws BadLocationException
    {
        set((new StringBuffer(get())).replace(aWhere, aWhere, aStr).toString());
        return new InsertUndo(aWhere, aStr.length());
    }

    private Object model;
    private Method getter;
    private Method setter;
}
Code:
import javax.swing.text.PlainDocument;

public class MyDocument extends PlainDocument
{

    public MyDocument(Object anObject, String aPropertyName)
        throws IllegalParameterException
    {
        super(new ContentAdapter(anObject, aPropertyName));
    }
}
Code:
import java.awt.Container;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class TestTextfieldModel extends JFrame
{

    public TestTextfieldModel()
    {
        data = null;
        data = "\n";
    }

    public String getData()
    {
        return data;
    }

    public void setData(String aData)
    {
        data = aData;
    }

    public static void main(String args[])
    {
        TestTextfieldModel textfieldModel = new TestTextfieldModel();
        JTextField textField = new JTextField();
        javax.swing.text.Document document = null;
        try
        {
            document = new MyDocument(textfieldModel, "Data");
        }
        catch(IllegalParameterException e)
        {
            e.printStackTrace();
        }
        int where = 1;
        String a = "an";
        String b = "Sdro";
        System.out.println("Test: " + b.substring(0, where) + a + b.substring(where));
        textField.setDocument(document);
        textfieldModel.getContentPane().add(textField);
        textfieldModel.pack();
        textfieldModel.setDefaultCloseOperation(3);
        textfieldModel.setVisible(true);
    }

    private String data;
}
 

MPW

Top Contributor
Das ist ja ganz nett, aber was willst du denn bezwecken? Wenn du grafisch was umgestallten willst(und zwar nur das), dann würde ich die Klasse dem orginal JTextField extenden lassen und dann die entsprechenden Methoden bloß überschreiben, du versuchst ja was ganz neues...das ist viel zu aufwendig.
 

gizmo

Bekanntes Mitglied
Graphisch will ich es nicht verändern, das soll genau so sein, wie das Original. Ich will nur die Datenhaltung ändern. Sonst müsste ich mit Listenern immer schauen wann sich der Text ändert und ihn dann in meinem Model neu setzen. Was ich bezwecken will ist, dass die Daten welche ich im Textfield eingebe direkt in meinem Model landen. Ohne einen Umweg über Listener zu machen.
 

MPW

Top Contributor
hm...wo ist das Problem mit den Listenern? naja egal...musst du ja wissen....

Ähm hast du schonmal an Threads gedacht? einfach alle 0,5 oder 0,2 Sekunden einen abgleich machen, das kann man in 10 Zeilen Code machen....nicht so seitenweise wie du...

Ähm, hab' jetzt nicht genau gefunden, wo du die eingaben machst, du brauchst doch die neuen Buchstaben nur in der anderen Reihenfolge dran zu hängen, dann hast du die Reihenfolge, die du willst;-)
 
R

Roar

Gast
gizmo hat gesagt.:
Graphisch will ich es nicht verändern, das soll genau so sein, wie das Original. Ich will nur die Datenhaltung ändern. Sonst müsste ich mit Listenern immer schauen wann sich der Text ändert und ihn dann in meinem Model neu setzen. Was ich bezwecken will ist, dass die Daten welche ich im Textfield eingebe direkt in meinem Model landen. Ohne einen Umweg über Listener zu machen.

wenn ich dich richtig verstehe hast du: ein JTextField und ein EinModel und der text soll in EinModel direkt beim tippen aktualisiert werden? :autsch: nunja ich verstehe zwar nicht wozu das gut sein soll aber ladde. warum nicht mit listenern? warum auch immer: wenn du das machen willst was ich denke, dann ist dein code da doch wohl mehr als überflüssiger quark. du könntest von PlainDocument ableiten, was du jetzt schon machst und den text in der insertStrign() bzw remove() methode updaten, aber bringen tuts im vergleich zu listenern nichts.
 

MPW

Top Contributor
Roar hat gesagt.:
wenn ich dich richtig verstehe hast du: ein JTextField und ein EinModel und der text soll in EinModel direkt beim tippen aktualisiert werden? :autsch: nunja ich verstehe zwar nicht wozu das gut sein soll aber ladde. warum nicht mit listenern? warum auch immer: wenn du das machen willst was ich denke, dann ist dein code da doch wohl mehr als überflüssiger quark. du könntest von PlainDocument ableiten, was du jetzt schon machst und den text in der insertStrign() bzw remove() methode updaten, aber bringen tuts im vergleich zu listenern nichts.

^^das das Quark ist habe ich mir auch schon gedacht, wollte es nur nicht so direkt sagen, da ich nicht so durchschaut habe, was er eigentlich will....aber im Prinzip ist es doch egal ob ich Action = Reaktio in einem Listener stecke oder durch einen normalen Methodenaufruf regele, oder?
 

gizmo

Bekanntes Mitglied
Ich wollte zuerst auch von PlainDocument ableiten und dort Methoden überschreiben. Weil aber die Daten im Content liegen, wäre das keine saubere Lösung. Ausserdem gibt es nicht nur zwei Methoden, welche ich überschreiben müsste, der Aufwand wäre grösser.

Lasst doch bitte mich entscheiden, ob es sinnvoll ist, was ich mache. Ich habe einige Textfelder, deren Inhalt ich im Model halten will. Der Aufwand ist kleiner, einmal setDocument aufzurufen und dort ein Objekt und einen String zu übergeben, als für jedes Textfeld einen ActionListener zu erstellen. Eine andere Möglichkeit wäre es gewesen, einen universellen Listener zu erstellen, aber der wäre weniger universell. Ausserdem ist es auch eine Herausforderung mal etwas neues zu versuchen.

Es wäre mir viel lieber, ihr könntet mir einen Lösungsansatz bieten, anstatt zu sagen, dass mein Code Quark ist, denn das weiss ich auch selbst, sonst würde er schliesslich funktionieren.

Grüsse Gizmo
 
R

Roar

Gast
gizmo hat gesagt.:
Ich wollte zuerst auch von PlainDocument ableiten und dort Methoden überschreiben. Weil aber die Daten im Content liegen, wäre das keine saubere Lösung. Ausserdem gibt es nicht nur zwei Methoden, welche ich überschreiben müsste, der Aufwand wäre grösser.

doch, 2 methoden: insertString() und remove(). üebrschreibt diese, ruf die super methode auf und setze die daten in deinem model: model.setData(getText());
 

gizmo

Bekanntes Mitglied
Wow!

Ok, du hattest recht, tut mir leid... Nun ist auch der Code nicht mehr so lang. Auf die Idee super aufzurufen wäre ich nicht gekommen, ist zwar eigentlich logisch. Die Daten sind zwar nun vermutlich doppelt gespeichert, aber hauptsache es funktioniert...

Danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
D Neues Dialog Mittig auf dem Bildschirm AWT, Swing, JavaFX & SWT 4
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
W Neues TableModel und JTable wird nicht refreshed AWT, Swing, JavaFX & SWT 3
Wirago Swing neues Fenster nicht sichtbar AWT, Swing, JavaFX & SWT 6
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
GianaSisters AWT Per Button neues Element auf den jPanel setzen AWT, Swing, JavaFX & SWT 6
J Mit Button neues Fenster öffnen AWT, Swing, JavaFX & SWT 17
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
J jme neues projekt öffnen AWT, Swing, JavaFX & SWT 4
T neues Fenster durch Button öffnen funktioniert nicht!! AWT, Swing, JavaFX & SWT 2
H Applet JApplet soll neues Tab im Browser öffnen AWT, Swing, JavaFX & SWT 2
X Swing Neues Fenster erzeugen AWT, Swing, JavaFX & SWT 3
M Swing jcombobox als jtable-editor: neues Item auswählen AWT, Swing, JavaFX & SWT 4
O Button (ActionPerformed) soll neues JFrame erzeugen AWT, Swing, JavaFX & SWT 8
Dit_ Mit Button "Weiter" neues Panel laden, altes ausblenden... AWT, Swing, JavaFX & SWT 4
H Swing [gelöst]Neues Swing Element erstellen AWT, Swing, JavaFX & SWT 4
H Swing neues fenster AWT, Swing, JavaFX & SWT 2
D Neues Java Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JList und ein neues Element oben in der Liste einfügen AWT, Swing, JavaFX & SWT 4
N Durch Button drücken neues Fenster öffnen AWT, Swing, JavaFX & SWT 13
I Applet --> neues Fenster öffnen AWT, Swing, JavaFX & SWT 11
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
F neues Fenster öffnen AWT, Swing, JavaFX & SWT 2
N in jScrollPane, neues Swing Element hinzufügen AWT, Swing, JavaFX & SWT 6
T Jbutton geklickt, dann neues Fenster AWT, Swing, JavaFX & SWT 4
S Neues Panel in JFrame anzeigen durch Button klick AWT, Swing, JavaFX & SWT 2
M Will ein neues Fenster AWT, Swing, JavaFX & SWT 13
D Neues JPanel ohne Symbolleisteneintrag AWT, Swing, JavaFX & SWT 6
G JButton benutzen um ein neues JFrame zu erstellen AWT, Swing, JavaFX & SWT 3
J Problem: neues Fenster bei dispose öffnen AWT, Swing, JavaFX & SWT 8
M neues Frame per klick anzeigen AWT, Swing, JavaFX & SWT 9
M Neues Programm? AWT, Swing, JavaFX & SWT 20
G Neues Frame über Button öffnen lassen AWT, Swing, JavaFX & SWT 15
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
hamburger_jung Mit Button Klick neues Fenster öffnen. AWT, Swing, JavaFX & SWT 1
M fortführung neues Bild laden AWT, Swing, JavaFX & SWT 12
M neues Bild laden AWT, Swing, JavaFX & SWT 15
V JOptionPane neues outfit mit BasicOptionPaneUI? AWT, Swing, JavaFX & SWT 22
J JList - doppelklick auf item -> neues fenster öffnet sich AWT, Swing, JavaFX & SWT 2
M Neues Fenster öffnen AWT, Swing, JavaFX & SWT 2
D in neues Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 3
G JTree. Neues Element hinzufügen und Selection beibehalten! AWT, Swing, JavaFX & SWT 3
M Tooltip / neues Fenster AWT, Swing, JavaFX & SWT 6
J Neues Problem AWT, Swing, JavaFX & SWT 9
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
S UI Model Binding AWT, Swing, JavaFX & SWT 7
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
B JavaFX mvvmfx - Model AWT, Swing, JavaFX & SWT 3
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JList Model filtern AWT, Swing, JavaFX & SWT 4
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
P jTable model setzen AWT, Swing, JavaFX & SWT 6
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
earlgrey_tea JTextfield Model AWT, Swing, JavaFX & SWT 14
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
C Swing JTable verbindet sich nicht mit Model AWT, Swing, JavaFX & SWT 20
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
C Swing MVC Verbindung von Model und Db AWT, Swing, JavaFX & SWT 23
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
R Swing Designfrage - Zusammenspiel Model / View AWT, Swing, JavaFX & SWT 10
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
K Swing JTable Model aktualisieren AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben