PropertyEditorSupport ruft setValue() nie auf

Alles zu NetBeans als RCP-Platform

Moderator: wegus

padde
Beiträge: 96
Registriert: 16.03.2010, 09:21

PropertyEditorSupport ruft setValue() nie auf

Beitragvon padde » 06.10.2014, 14:13

Hallo,

ich habe die letzten Tage daran gearbeitet, für unsere Anwendung Funktionalität zu implementieren, die es dem Anwender erlaubt, Code einzugeben. Dieser Code ist in der Regel ein Einzeiler und ist mehr oder weniger ein logischer Ausdruck. Dieser Code wird nach der Eingabe in ein XML-Format gewandelt, welches als Grundlage für unsere Anwendung dient. Das klappt auch soweit alles, ich habe eine Grammatik für ANTLR4 erstellt und damit einen Lexer & Parser entwickelt. Auch das Syntax Highlightling funktioniert durch die Nutzung eines JEditorPane und passendem MIME-Type.

Hier liegt aber auch das Problem begraben. Wie bereits erwähnt, ist der Code eigentlich nur ein Einzeiler und soll auch im Properties-Fenster bearbeitet werden können. Erst hatten wir das ganze als InplaceEditor gestaltet. Da hatte ich dann ein JEditorPane in eine JScrollPane gelegt und dieses als component zurück gegeben. Das war aber erstens nicht sonderlich praktikabel aufgrund der Breite des Properties-Fensters und außerdem war es nicht wirklich möglich, die Eingabe sauber zu beenden, da ENTER in einem JEditorPane zu einer neuen Zeile führt.

Nun haben wir uns entschieden, den InplaceEditor durch einen normalen Custom Editor zu ersetzen, anbei Code:

Code: Alles auswählen

public class MyEditorSupport extends PropertyEditorSupport implements ExPropertyEditor {

    private static final Logger log = Logger.
            getLogger(MyEditorSupport.class.getName());

    private final JEditorPane editorPane;
    private final JScrollPane component;

    public MyEditorSupport() {
        log.log(Level.INFO, "Creating new MyEditorSupport().");

        editorPane = new JEditorPane();
        editorPane.setText("");
        editorPane.setContentType("text/x-mycodemime");
        editorPane.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent e) {
                log.log(Level.INFO,
                        "Insert update. Length: {0}, Offset: {1}, Type: {2}.",
                        new Object[]
                         {e.getLength(), e.getOffset(), e.getType()}
                );
                log.log(Level.INFO, "editorPane.getText(): {0}", editorPane.getText());

                firePropertyChange();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                log.log(Level.INFO,
                        "Remove update. Length: {0}, Offset: {1}, Type: {2}.",
                        new Object[] {e.getLength(), e.getOffset(), e.getType()}
                );
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                log.log(Level.INFO,
                        "Change update. Length: {0}, Offset: {1}, Type: {2}.",
                        new Object[] {e.getLength(), e.getOffset(), e.getType()}
                );
            }
        });

        component = new JScrollPane(editorPane);
        final Dimension dimension = new Dimension(100, 20);
        component.setMinimumSize(dimension);
        component.setPreferredSize(dimension);
    }

    @Override
    public void attachEnv(final PropertyEnv env) {
        env.setState(PropertyEnv.STATE_VALID);
    }

    @Override
    public String getAsText() {
        log.log(Level.INFO, "getAsText(): {0}", editorPane.getText());
        return editorPane.getText();
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        log.log(Level.INFO, "setAsText(): {0}", text);
        editorPane.setText(text);
        setValue(text);
    }

    @Override
    public Component getCustomEditor() {
        return component;
    }

    @Override
    public boolean supportsCustomEditor() {
        return true;
    }

    @Override
    public void setValue(Object value) {
        if (value instanceof String) {
            final String code = (String) value;
            log.log(Level.INFO, "setValue(): {0}.", code);
            editorPane.setText(code);
        } else {
            log.log(Level.INFO, "Error setting code, value is not a String ({0}).", value.getClass().toString());
            editorPane.setText("Error reading code.");
            editorPane.setEditable(false);
        }

        super.setValue(editorPane.getText());
    }
}


Ich kann dort leider tun was ich will, nach dem Klicken auf "OK" im geöffneten Dialog, welches meine JEditorPane beinhaltet, wird setValue() nicht aufgerufen. Siehe folgenden Log:

Code: Alles auswählen


INFO [de.nowak.myapp.MyEditorSupport]: Creating new MyEditorSupportSupport().
INFO [de.nowak.myapp.MyEditorSupport]: setValue(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0))))).
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 111, Offset: 0, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))

// updating data in the PropertyEditor here!

INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): (("test" == 1.0) && ( && ((mov("test2", 12345) >= dec("test1", 54321)) && (123.0hyst(10.0) < 456.0hyst(4.0)))))
INFO [de.nowak.myapp.MyEditorSupport]: Remove update. Length: 111, Offset: 0, Type: REMOVE.
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 0, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "
INFO [de.nowak.myapp.MyEditorSupport]: Remove update. Length: 1, Offset: 0, Type: REMOVE.
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 0, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 1, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "t
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 2, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "te
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 3, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "tes
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 4, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 5, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test"
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 6, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test"
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 7, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test" <
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 8, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test" <
INFO [de.nowak.myapp.MyEditorSupport]: Insert update. Length: 1, Offset: 9, Type: INSERT.
INFO [de.nowak.myapp.MyEditorSupport]: editorPane.getText(): "test" < 5
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): "test" < 5
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): "test" < 5
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): "test" < 5
INFO [de.nowak.myapp.MyEditorSupport]: getAsText(): "test" < 5


Nutzen tue ich meinen PropertyEditorSupport in einem AbstractNode, indem ich Properties erstelle, in diesem Fall genauer gesagt PropertySupport.ReadWrite. Dort habe ich die Methode getPropertyEditor() überschrieben und geben dort ein Objekt meines PropertyEditorSupport zurück.

Hat jemand vielleicht eine Idee, was ich hier falsch mache?

Gruß,
Patrick

padde
Beiträge: 96
Registriert: 16.03.2010, 09:21

Re: PropertyEditorSupport ruft setValue() nie auf

Beitragvon padde » 08.10.2014, 08:55

Mittlerweile habe ich das ganze gelöst. Ich rufe nun im DocumentListener setValue() auf. In setValue() setze ich den Text der editorPane (eigentlich nur beim ersten Setzen) und lösche davor den DocumentListener vom EditorPane und füge ihn danach wieder hinzu. Außerdem habe ich die ganzen GUI-Komponenten ausgelagert und das ganze voneinander getrennt.

So ganz zufrieden mit der Lösung bin ich noch nicht, das wirkt alles noch sehr dreckig. Ich forsche da gerade weiter, wie denn da nun der sauberste Weg wäre, das zu lösen.

Benutzeravatar
smurfi
Site Admin
Beiträge: 1617
Registriert: 29.06.2006, 11:33
Wohnort: Wuppertal
Kontaktdaten:

Re: PropertyEditorSupport ruft setValue() nie auf

Beitragvon smurfi » 09.10.2014, 10:19

Danke für deine Antwort, wenn du dir auch selbst geholfen hast,


Zurück zu „NetBeans - Platform / RCP“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste