uepselon: Zeilen von JTextPane ermitteln?

Hallo,

Ich habe ein JTextPane.
In einer Variable var = 4 steht eine Zeilenummer.

Nun will ich den Cursor (Caret) in die Zeile setzen die in var steht.
Wie mach ich das? Ich kann mit setCaretPosition(index) ja nur den offset angeben jedoch nicht die Zeile????

Gruß,
ueps

  1. Hallo,

    Nun will ich den Cursor (Caret) in die Zeile setzen die in var steht.
    Wie mach ich das? Ich kann mit setCaretPosition(index) ja nur den offset angeben jedoch nicht die Zeile????

    Eine direkte Möglichkeit ist mir nicht bekannt, was aber nicht heißt,
    daß es sie nicht gibt. Vielleicht hilft die Google weiter. Ein paar
    deiner Frage ähnliche Fragen habe ich schon gefunden. Leider ohne
    Antwort.

    Wenn es keine direkte Möglichkeit gibt, kannst du ja noch immer den
    Text auslesen und Zeichen für Zeichen durchgehen (bzw. mit indexOf("\n")),
    die Zeilenumbrüche zählen und damit den Offset bestimmen. Natürlich
    ist das keine sehr schöne oder performante Lösung. (Vermutlich würde
    es eine API-Methode aber auch nicht anders können. Wie auch?)
    Beachte aber, daß ein Zeilenumbruch nicht auf allen Plattformen
    gleich ist.

    Falls du einen direkten Weg finden solltest, wäre ich an der
    Lösung natürlich auch interessiert.

    Gruß
    Slyh

    --
    Es gibt 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
    1. Hallo,

      Wenn es keine direkte Möglichkeit gibt, kannst du ja noch immer den
      Text auslesen und Zeichen für Zeichen durchgehen (bzw. mit indexOf("\n")),
      die Zeilenumbrüche zählen und damit den Offset bestimmen.

      Jepp, das habe ich bisher gemacht. Gefällt mir aber noch nciht so ganz.

      Beachte aber, daß ein Zeilenumbruch nicht auf allen Plattformen
      gleich ist.

      Ich kenn nur "\r\n" und "\n" daher bin ich mit \n doch auf der sicheren seite, hoffe ich, da es in beiden varianten drin steckt.

      Gruß,
      ueps

      1. Hallo,

        Beachte aber, daß ein Zeilenumbruch nicht auf allen Plattformen
        gleich ist.

        Ich kenn nur "\r\n" und "\n" daher bin ich mit \n doch auf der sicheren seite, hoffe ich, da es in beiden varianten drin steckt.

        Nein, es könnte auch nur "\r" sein. Du brauchst dir aber gar nicht
        diesen Streß machen. Du kannst das/die Zeichen, das/die auf der
        aktuellen Plattform als Zeilenumbruch interpretiert wird/werden,
        über die System-Property "line.separator" ermitteln.
        Also etwa so:
          String lineSeparator = System.getProperty("line.separator");

        Guck dir am besten mal die getProperties()-Methode der Klasse
        java.lang.System an. Dort sind alle Properties aufgeführt.

        Gruß
        Slyh

        --
        Es gibt 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
        1. Hallo,

          Guck dir am besten mal die getProperties()-Methode der Klasse
          java.lang.System an. Dort sind alle Properties aufgeführt.

          Danke für den Tipp.

          Ich hab jetzt jedoch noch ein ganz neues Problem.
          Ich Versuche mit Runtime.exec("......") ein Programm auszuführen. Besser gesagt "java XXX" Wobei XXX im Programm gesetzt wird.
          Wenn XXX jedoch nicht im aktuellen Verzeichnis ist scheitert die ganze Aktion. Hast du da evtl. nen Tipp. exec(cmd, env, dir) Hab ich schon versucht, das Problem ist das diese Funktion im JDK 1.2 nicht funktioniert: Fehler WRONG NUMBER OF ARGUMENTS :-))) obwohls stimmt.
          Ist glaube ich ein offizieller BUG. Wie kann ich exec dazu bringen den Befehl im gewünschten Verzeichnis auszuführen??

          Gruß,
          ueps

          1. Hallo,

            Ich Versuche mit Runtime.exec("......") ein Programm auszuführen.
            Wenn XXX jedoch nicht im aktuellen Verzeichnis ist scheitert die ganze Aktion. Hast du da evtl. nen Tipp. exec(cmd, env, dir) Hab ich schon versucht, das Problem ist das diese Funktion im JDK 1.2 nicht funktioniert: Fehler WRONG NUMBER OF ARGUMENTS :-))) obwohls stimmt.

            Runtime.exec(String command, String[] envp, File dir) gibt es erst
            seit JDK 1.3. Daher kann es mit JDK 1.2 gar nicht funktionieren.

            Leider habe ich auch keine Möglichkeit gefunden, wie du diese
            Funktionweise in irgend einer Form nachbauen könntest.
            Die genannte exec-Methode ruft selbst nämlich eine interne (also
            plattformabhängige) Methode auf, die du natürlich nicht mit Java
            nachbilden kannst.

            Ich habe es versucht, über die Property "user.dir" das momentane
            Arbeits-Verzeichnis zu ändern und anschließend erst exec()
            aufzurufen. Hat leider aber nicht geklappt.

            Das Problem ist halt einfach, daß Verzeichnisse nicht plattform-
            unabhängig sind, Java das aber sein möchte.

            Ich sehe zur Zeit keinen Weg, dein gewünschtes Verhalten mit JDK 1.2
            und reinem Java zu erreichen. Vielleicht weiß ja ein anderer Mitleser
            mehr.

            Gruß
            Slyh

            --
            Es gibt 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
          2. Hallo,

            Ich hab jetzt jedoch noch ein ganz neues Problem.
            Ich Versuche mit Runtime.exec("......") ein Programm auszuführen. Besser gesagt "java XXX" Wobei XXX im Programm gesetzt wird.

            Hä? D willst eine Java-Class mit Runtime.exec("java classname"); starten? Das ist nicht Dein Ernst?

            import classname;
            ...
            classname c = new classname();
            ...

            viele Grüße

            Axel

            1. Hi,

              Hä? D willst eine Java-Class mit Runtime.exec("java classname"); starten? Das ist nicht Dein Ernst?

              import classname;
              ...
              classname c = new classname();
              ...

              So einfach ist es leider nicht. Ich bin gerade dabei einen "kleinen" Java Editor zu basteln. Ich bin inzwischen soweit das uch java Code laden kann und diesen auch aus dem Editor heraus kompiliert wird und die Fehelr direkt im Editor angezeigt werden. Das Problem ist jetzt halt das ich bei erfolgreicher Kompilierung das Programm auch starten möchte. Ich kann es jedoch nicht fix in den Editor Quelltext sxhreiben, daher exec(java classname), geht aber nur wenn die Klasse im akteullen verzeichnis liegt. bei exec(javac javasource) geht es komischerweise wenn ich den pfad mit angebe, bei (java class) geht es nur wenn ich (java -cp class) mache. Das Problem ist hierbaei, jedoch das Bilder etc. die in einem Unterverzeichnis liegen, bei java -cp classname nicht mehr gefunden werden.

              Gruß

              ueps

              1. Hallo,

                So einfach ist es leider nicht. Ich bin gerade dabei einen "kleinen" Java Editor zu basteln. Ich bin inzwischen soweit das uch java Code laden kann und diesen auch aus dem Editor heraus kompiliert wird und die Fehelr direkt im Editor angezeigt werden. Das Problem ist jetzt halt das ich bei erfolgreicher Kompilierung das Programm auch starten möchte.

                Also, wenn das nicht _nur_ eine Übung für Dich sein soll, dann investiere lieber nicht so viel Hirnschmalz in dieses Projekt. Es lohnt sich nicht.

                http://www.javaeditor.de/index.php

                viele Grüße

                Axel

                1. Hallo,

                  Also, wenn das nicht _nur_ eine Übung für Dich sein soll, dann investiere lieber nicht so viel Hirnschmalz in dieses Projekt. Es lohnt sich nicht.

                  http://www.javaeditor.de/index.php

                  In der Tat gibt es für jeden erdenklichen Bereich diverse Programme.
                  Wenn man dies immer als Todestoß für eigene Ideen nehmen würde, wo bliebe da der Spaß und der Wille für Verbeserungen?

                  Für mich ist das ganze bis jetzt eher ein Übungsprojekt. Ich arbeite derzeit "nebenbei" an zwei Java Applikationen. Der Editor und eben eine Schachprogg. Da sich letzteres als etwas Umfangreicher herausgestellt hat, fokussiere ich mich jetzt auf den Editor.
                  Es soll ja auch kein "reiner" Java Editor werden. Ziel ist es eher, ein universellen Editor zu gestalten, der auch andere Compiler einbinden kann. Aber wie gesagt es ist noch kein kommerzielles Projekt.

                  Gruß,
                  ueps

          3. Hi,

            Besser gesagt "java XXX" Wobei XXX im Programm gesetzt wird.

            Wenn XXX jedoch nicht im aktuellen Verzeichnis ist scheitert die ganze Aktion. Hast du da evtl. nen Tipp. exec(cmd, env, dir) Hab ich schon versucht, das Problem ist das diese Funktion im JDK 1.2 nicht funktioniert: Fehler WRONG NUMBER OF ARGUMENTS :-))) obwohls stimmt.

            'Reicht es' nicht, wenn XXX im CLASSPATH liegt?

            Viele Grüße,
            Martin Jung

            1. Hi,

              'Reicht es' nicht, wenn XXX im CLASSPATH liegt?

              Das Problem ist dann z.B. folgendes:

              ich mache "java -cp class_with_other_path"

              Diese Klasse verwendet aber z.B. Bilder aus einem Unterverzeichnis:

              new ImageIcon("class_with_other_path/icons/icon.gif");

              Diese Bilder können dann eben nicht mehr geladen werden.

              Gruß

              ueps

              1. Hi ueps,

                Frage: 'java -cp class' - wo ist bei dieser Syntax der _Wert_ von '-cp'?
                Es muss doch heißen: java -cp path1;path2 class

                Du musst bei 'irgendeinPfad/images/icons' 'irgendeinPfad' flexibel machen. Am einfachtsten ginge das, in dem Du eine entsprechende System-Property definierst, die Du dann (vielleicht über einen Singleton Resourcen-Manager verwaltet) zur Laufzeit ausliest.

                Beispiel (ungetestet):
                java -cp path1;path2 -DappPath=D:/myEditor/myApp class

                public final static String RESOURCE_PATH = System.getProperty("appPath") + "/";
                    public final static String IMAGE_PATH = RESOURCE_PATH + "images/";
                    public final static String ICON_PATH = IMAGE_PATH + "icons/";
                    --//--
                    ImageIcon icon = new ImageIcon(ICON_PATH + "icon.gif");

                Wäre das ein Lösungansatz für Dein Problem?

                Wenn nicht: Könntest Du Dir 'mal die Mühe machen, die _genauen_ Pfadstrukturen anzugeben. Also, die Pfad/CLASSPATH-Strukturen des Editors _und_ diese des mit Deinem Editor zu erstellenden Programms.

                Viele Grüße,
                Martin Jung

                1. Hallo,

                  Wenn nicht: Könntest Du Dir 'mal die Mühe machen, die _genauen_ Pfadstrukturen anzugeben. Also, die Pfad/CLASSPATH-Strukturen des Editors _und_ diese des mit Deinem Editor zu erstellenden Programms.

                  Danke für deine Mühe, aber so richtig ist mir die Lösung noch nicht geglückt. Die Struktur des  mit dem Editor zu erstellenden Programms ist eben nicht fest, sondern flexibel. die Ordnern, müssen nicht images oder icons heißen. Für den User des Editors sollte es keine Rolle spielen wie er seine Applikation strukturiert. Mit deinem Lösungweg müsste er ja jedesmal seinen Code an meinen Editor anpassen damit es funktioniert, oder nicht?

                  Gruß,
                  ueps

                  1. Hi ueps,

                    Danke für deine Mühe, aber so richtig ist mir die Lösung noch nicht geglückt. Die Struktur des  mit dem Editor zu erstellenden Programms ist eben nicht fest, sondern flexibel. die Ordnern, müssen nicht images oder icons heißen. Für den User des Editors sollte es keine Rolle spielen wie er seine Applikation strukturiert. Mit deinem Lösungweg müsste er ja jedesmal seinen Code an meinen Editor anpassen damit es funktioniert, oder nicht?

                    Jein, man muesste halt _alle_ Resource-Pfade flexibel machen. Vielleicht lohnt auch ein Blick in die Eclipse-Sourcen, um weitere Lösungsansätze zu finden?

                    Viele Grüße,
                    Martin Jung

  2. Hallo,

    Ich habe ein JTextPane.
    In einer Variable var = 4 steht eine Zeilenummer.
    Nun will ich den Cursor (Caret) in die Zeile setzen die in var steht.
    Wie mach ich das? Ich kann mit setCaretPosition(index) ja nur den offset angeben jedoch nicht die Zeile????

    Du musst mit dem Document im JTextPane arbeiten:

    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    import java.awt.event.*;

    public class tpanel extends JFrame {

    public tpanel() {
            super("TPanel");
            JTextPane jtp = new JTextPane();
            Document d = jtp.getDocument();
            try {
              d.insertString(0,
                "Das ist der Textinhalt \n" +
                "in mehreren Zeilen \n" +
                "Das ist der Textinhalt \n" +
                "in mehreren Zeilen \n" +
                "Das ist der Textinhalt \n" +
                "in mehreren Zeilen \n" +
                "Das ist der Textinhalt \n" +
                "in mehreren Zeilen \n", null
              );
            } catch (BadLocationException ble) {}

    Element bereich = d.getDefaultRootElement();
            int anzAbsaetze = bereich.getElementCount();
            System.out.println(anzAbsaetze);

    //gehe zu Zeile 4
            int pos = bereich.getElement(3).getStartOffset();
            jtp.setCaretPosition(pos);

    JPanel cp = new JPanel();
            cp.add(jtp);
            setContentPane(cp);
        }

    public static void main(String[] args) {
            JFrame f = new tpanel();
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            f.pack();
            f.setSize(200,200);
            f.setVisible(true);
        }
    }

    http://javaalmanac.com/cgi-bin/search/find.pl?words=jtextpane+document

    viele Grüße

    Axel

    1. Hi,

      merci das ist genau das was ich gesucht habe.

      Gruß

      ueps