JTextField -> CaretPos bei SelectionStart() setzten nicht bei SelectionEnd()

JavaRentner

Aktives Mitglied
Guten Tag

Ausgangslage:
JTextField mit Text ("Warum auch nicht")
setze:
SelectionStart(3)
SelectionEnd(JTextField.getText().length)

Text ist richtig selektiert!
Aber der Cursor blinkt am ENDE der selektion.

SetCaretPosition(3) setzt den Cursor an Position 3 auch gut.
(leider ist jetzt kein Text mehr selektiert.)

Frage:
Gibt es eine Möglichkeit, dass der Cursor an dritter Stelle blinkt aber der Text ab dieser bis ende Text selektiert bleibt?
Brauchts dazu einen Renderer? Wenn JA, wie müsste dann entsprechende Befehlsgebung aussehen?

Vielen Dank
 

mihe7

Top Contributor
Das funktioniert, wie in den JavaDocs dokumentiert:
Java:
textField.setCaretPosition(textField.getText().length());
textField.moveCaretPosition(3);
 

JavaRentner

Aktives Mitglied
OK
Wo liegt der Unterschied von:
Code:
textField.moveCaretPosition(3);
und
Java:
textField.seCaretPosition(3);

in beiden fällen ist nichts mehr selektiert...

Dann wie kann ich, wenn der Text im TextField länger ist als die Breite des TextField, die länge des sichtbaren Textes herausfinden?

So könnte ich doch ab dem setSelectionStart(3) bis setSelectionEnd(letztes sichtbare Zeichen) selektieren?
Damit wäre mir schon geholfen.
 

mihe7

Top Contributor
in beiden fällen ist nichts mehr selektiert...
setCaretPosition entfernt die Auswahl, moveCaretPosition erzeugt eine Auswahl, ausgehend von der aktuellen Position. Wenn Du es so wie in Kommentar #2 gezeigt machst, wird zuerst der Cursor auf das Ende des Textfelds gesetzt - die Auswahl wird entfernt - und anschließend - mit Auswahl - auf die Position 3 (0-based) bewegt.

Dann wie kann ich, wenn der Text im TextField länger ist als die Breite des TextField, die länge des sichtbaren Textes herausfinden?
Java:
import java.awt.*;
import javax.swing.*;

public class TfTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JTextField tf = new JTextField(5);
            tf.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr");

            JPanel input = new JPanel();
            input.add(tf);

            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.add(input, BorderLayout.WEST);
            frame.setSize(400, 300);
            frame.setVisible(true);

            Insets insets = tf.getInsets();
            int pos = tf.viewToModel2D(new Point(tf.getWidth() - insets.right, insets.top));
            tf.setCaretPosition(pos);
            tf.moveCaretPosition(3);
        });
    }
}
/code]
 

bärrr

Mitglied
Mist, das hätte ich nicht gedacht... Es ist nicht möglich, etwas zu selektieren und dabei den Caret auf den Anfang der Selektion zu setzen ...

Java:
import javax.swing.*;

public class SelectDemo {
    public enum SelectCaretBehavior {
        DO_NOT_MOVE_CARET,
        MOVE_CARET_TO_SELECT_START,
        MOVE_CARET_TO_SELECT_END
    }

    private final JTextArea textArea1 = new JTextArea("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed d");

    public SelectDemo() {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("SelectDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            frame.setVisible(true);

            textArea1.setLineWrap(true);
            frame.add(new JScrollPane(textArea1));
        });
    }

    public void selectText(int start, int end, SelectCaretBehavior caretBehavior) {
        switch (caretBehavior) {
            case DO_NOT_MOVE_CARET:
                break;
            case MOVE_CARET_TO_SELECT_START:
                textArea1.setCaretPosition(start);
                break;
            case MOVE_CARET_TO_SELECT_END:
                textArea1.setCaretPosition(end);
                break;
        }
        textArea1.select(start, end);
    }

    public static void main(String[] args) {
        new SelectDemo().selectText(5, 10, SelectCaretBehavior.MOVE_CARET_TO_SELECT_START);
    }
}

Leider doch ein Bug
 

bärrr

Mitglied
Danke, das geht:

Java:
import javax.swing.*;

public class SelectDemo {
    public enum SelectCaretBehavior {
        DO_NOT_MOVE_CARET,
        MOVE_CARET_TO_SELECT_START,
        MOVE_CARET_TO_SELECT_END
    }

    private final JTextArea textArea1 = new JTextArea("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed d");

    public SelectDemo() {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("SelectDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            frame.setVisible(true);

            textArea1.setLineWrap(true);
            frame.add(new JScrollPane(textArea1));
        });
    }

    public void selectText(int start, int end, SelectCaretBehavior caretBehavior) {
        if (start < 0 || end > textArea1.getText().length()) {
            throw new IllegalArgumentException("Indexes out of bounds");
        }
        if (caretBehavior == null) {
            throw new IllegalArgumentException("Caret behavior cannot be null");
        }
        switch (caretBehavior) {
            case DO_NOT_MOVE_CARET -> textArea1.select(start, end);
            case MOVE_CARET_TO_SELECT_START -> {
                textArea1.setCaretPosition(end);
                textArea1.moveCaretPosition(start);
            }
            case MOVE_CARET_TO_SELECT_END -> {
                textArea1.setCaretPosition(start);
                textArea1.moveCaretPosition(end);
            }
        }
    }

    public static void main(String[] args) {
        new SelectDemo().selectText(5, 10, SelectCaretBehavior.MOVE_CARET_TO_SELECT_START);
    }
}
 

JavaRentner

Aktives Mitglied
@mihe7
Das ist das Ergebnis, wenn ich den Code aus #6 laufen lasse:
funktioniert perfekt! 😄

Hab die Klasse etwas angepasst (TFTest.java) und sie macht genau das was ich wollte!
Aber in der Klasse TestMyCombo.java (MyCombo.java) wird mir der eingegebene Buchstabe selektiert und nicht ab dem eingegebenen Buchstabe bis ans ende des sichtbaren Textes wie im TFTest.java.

Ich hoffe es ist erlaubt das Projekte-Zip (69.5KiB) hier anzuhängen...?
(verwende im Projekt -> OpenJDK13)

Habe eine Methode [getInsetPos(JTextField tf)]
in TFTest.java wird mir:
Java:
int pos = tf.viewToModel2D(new Point(tf.getWidth() - insets.right, insets.top));
die position des letztem sichtbaren Zeichen zurückgegeben.

Aber in MyCombo.java, welche auch eine Methode [getInsetPos(JTextField tf)] enthält,
wird mir immer 0 zurückgegeben!

Zum testen sind beide Main-Methoden im Projekt enthalten.

Beim starten wird in beiden Mains "Noteworthy-Bold" im JTextField ausgegeben und CaredPosition ist 0!

Verhalten:
beim drücken der Taste "a" wird der Text durch den Schriftnamen "aakar" ersetzt.

in TFTest.java wird aakar selektiert.
in MyCombo.java aakar selektiert.

Was mache ich falsch, ich blick nicht durch!
Warum reagiert das JTextField in MyCombo.java nicht gleich wie das JTextField in TFTest.java

Wäre super, wenn jemand meinen Fehler aufzeigen könnte.
Vielen Dank.

PS: bei mir ist die erste Schriftart die mit a anfängt aakar! Es kann auch Arial sein...
 

Anhänge

  • MyCombo.zip
    69,5 KB · Aufrufe: 0
Zuletzt bearbeitet:

bärrr

Mitglied
Sollte ungefähr so gehen:

Java:
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class MyJTextArea extends JTextArea {
    private static final Font FONT = new Font("Arial", Font.PLAIN, 20);

    public MyJTextArea(String text) {
        super(text);
        setFont(FONT);
        setLineWrap(true);
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent evt) {
                setCaretToEnd();
            }
        });
        getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                setCaretToEnd();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                setCaretToEnd();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                setCaretToEnd();
            }
        });
    }

    public void setCaretToEnd() {
        try {
            int lastCharLineIndex = viewToModel2D(new Point(getWidth(), getInsets().top));
            int widthInPixel = getFontMetrics(FONT).stringWidth(getText(0, lastCharLineIndex));
            System.out.println("lastCharLineIndex: " + lastCharLineIndex);
            System.out.println("widthInPixel: " + widthInPixel);
            setCaretPosition(lastCharLineIndex);
        } catch (BadLocationException ignore) {
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        MyJTextArea area = new MyJTextArea("Hello, World! bla bla bla bla bla bla bla bla bla bla");
        frame.add(new JScrollPane(area));
        frame.setVisible(true);
    }
}

Aber das Problem ist, manchmal ist hinter dem letzten, sichtbaren Zeichen kein Platz mehr für den Caret ... dann wird es davor platziert.
 

mihe7

Top Contributor
Was mache ich falsch, ich blick nicht durch!
Der Code von mir ist im wahrsten Sinne des Wortes ein "edge case" - ich füge ja gerade mal die insets hinzu. Wäre davon ausgegangen, dass das so passt, tut es aber nicht (immer). Interessanterweise funktioniert es, wenn man tf.getHeight() - insets.bottom verwendet.

Java:
    private static int getInsetPos(JTextField tf) {
        Insets insets = tf.getInsets();
        int pos = tf.viewToModel2D(new Point(tf.getWidth() - insets.right, tf.getHeight() - insets.bottom));
        return pos;
    }

EDIT: weil es mir gerade einfällt... eventuell hängt das mit der Skalierung der Anzeige zusammen. Wenn ich 1 als top-Inset habe und das skaliere, könnte der int-Wert auf 0 abgeschnitten werden und das wäre dann außerhalb.
 

JavaRentner

Aktives Mitglied
@mihe7
Der Fehler von mir muss iwo anders liegen! Aber ich hab keinen Durchblick!
Das verhalten ist mit bottom äquivalent zu top.
Soll heissen, es funktioniert wie gewünscht! Egal bottom resp. top. (Post #9)

Nur wo mache ich den Fehler?
Im ZIP-Anhang habe ich die Klasse "MyCombo.java" und darin verwende ich die gleiche Methode wie im "TfTest.java" ebenfalls im ZIP:
Java:
    private static int getInsetPos(JTextField tf) {
        Insets insets = tf.getInsets();
        int pos = tf.viewToModel2D(new Point(tf.getWidth() - insets.right, insets.bottom));
        return pos;
    }
Im "TfTest.java" funktioniert es egal top resp. bottom!
In der Klasse "MyCombo.java" gibt er mir immer pos=0 zurück! Warum???

Heble ich das irgendwo aus und finde es nicht mehr?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W ein JLabel oder JTextfield in einem Canvas-Kontext einbringen : geht das ? Java Basics - Anfänger-Themen 4
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
S Möglichkeit, mit g.draw etwas vor ein JTextfield zu „zeichnen“? Java Basics - Anfänger-Themen 7
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
B Variablen Int Variabel in JTextField ändern Java Basics - Anfänger-Themen 2
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
M JTextField nur Zahleneingaben zulassen, eingabe sperren Java Basics - Anfänger-Themen 24
E JButton und JTextField Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
M Von einem JTextField Doublewerte entgegennehmen Java Basics - Anfänger-Themen 2
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
D Klassen JTextField wird nur zu 50% angezeigt. Java Basics - Anfänger-Themen 15
F JTextField Kursiv und Fett machen Java Basics - Anfänger-Themen 4
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
CptK Interface JTextField: Action mit Enter ausführen Java Basics - Anfänger-Themen 16
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
J Erste Schritte Wert aus JTextField zurückgeben Java Basics - Anfänger-Themen 6
F Aus einer anderen Klasse auf ein JTextField zugreifen Java Basics - Anfänger-Themen 17
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JTextField am Anfang unsichtbar o_o Java Basics - Anfänger-Themen 3
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
K OOP Mit anderer Klasse auf JTextField zugreifen Java Basics - Anfänger-Themen 5
Liondary JTextfield Java Basics - Anfänger-Themen 8
W JTextField-Objekt liest Umlaute mit falschen Zeichen ein Java Basics - Anfänger-Themen 5
Z Fürge nur ein JTextField ein und danach wird nichts mehr angezeigt Java Basics - Anfänger-Themen 3
S JTextField zu ArrayList hinzufügen Java Basics - Anfänger-Themen 3
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
Z JTextField - getText() Methode abbrechen? Java Basics - Anfänger-Themen 8
P jTextField - Auslesen, in Variablen speichern, eingeben... Java Basics - Anfänger-Themen 7
J Methoden JTextArea auslesen und in JTextfield ausgeben Java Basics - Anfänger-Themen 13
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
U Inhalt von JTextfield an andere Klasse weitergeben Java Basics - Anfänger-Themen 13
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
S Verhalten von JTextField in einem JTabbedPane (Register) Java Basics - Anfänger-Themen 6
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
G JTextField, DocumentListener, Fehler bei setText() Java Basics - Anfänger-Themen 3
S Input/Output GUI Eingabe in JTextfield in Variable speichern Java Basics - Anfänger-Themen 7
C JTextField füllen Java Basics - Anfänger-Themen 5
C jtextfield und jtable Java Basics - Anfänger-Themen 34
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
K Encoding von JTextfield Java Basics - Anfänger-Themen 2
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
P Klassen JTextfield aus anderer Klasse herausfüllen Java Basics - Anfänger-Themen 12
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
M Datumsformat in JTextfield Java Basics - Anfänger-Themen 10
S JTextField nervt rum... Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
C Problem mit JTextField Java Basics - Anfänger-Themen 8
A Klassen JTextField eigtl leer aber es werden Methoden ect. angezeigt Java Basics - Anfänger-Themen 9
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
L JTextField auslesen mit getText() wie abspeichern? Java Basics - Anfänger-Themen 2
D jtextField Ausgabe double Java Basics - Anfänger-Themen 4
D JTextField verwenden ohne Eingabe einer Variable Java Basics - Anfänger-Themen 4
J GUI - JTextField Anordnung Java Basics - Anfänger-Themen 2
S nur Buchstaben in JTextField Java Basics - Anfänger-Themen 3
S JTextfield Auswertung mit FocusListener Java Basics - Anfänger-Themen 7
M Hilfe JTextfield Ergebnis Java Basics - Anfänger-Themen 2
B GUI- JTextField - Übung Java Basics - Anfänger-Themen 5
M OOP Wie greife ich auf JTextField zu? Java Basics - Anfänger-Themen 2
P Eingabe aus JTextField/Area an eine andere Klasse übergeben. Java Basics - Anfänger-Themen 2
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
F GUI JTextField aktualisieren Java Basics - Anfänger-Themen 3
B jTextField bei Enter eingabe absenden? Java Basics - Anfänger-Themen 2
S JTextField leeren ohne setText("")? Java Basics - Anfänger-Themen 3
A fire button on JTextField Enter Java Basics - Anfänger-Themen 2
G JTextField() Anzeige - if-Anweisungen Java Basics - Anfänger-Themen 2
R Erste Schritte codecopieren von Editor nach Eclipse / JTextField Java Basics - Anfänger-Themen 4
L Zeichen in jTextField markieren Java Basics - Anfänger-Themen 2
M Text auf JTextField auslesen per Button Java Basics - Anfänger-Themen 4
L JTextField getText() gibt immer null zurück Java Basics - Anfänger-Themen 10
L Null Pointer Exception bei Focus Event bei einem JTextField Java Basics - Anfänger-Themen 2
C Ausgewähltes Element einer JCombobox in JTextField Java Basics - Anfänger-Themen 3
H Prüfen welches JTextfield ausgewählt/selektiert ist? Java Basics - Anfänger-Themen 7
B Input/Output jTextField - KeyEvent - Zeichen soll nicht erscheinen Java Basics - Anfänger-Themen 6
D JPasswordField - JTextField Java Basics - Anfänger-Themen 5
J JTextfield mit Enter leeren Java Basics - Anfänger-Themen 3
H JtextField auslesen und in JLable einfuegen Java Basics - Anfänger-Themen 7
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S mit eigener Klasse JTextField ändern Java Basics - Anfänger-Themen 3
M JTextField durch Button auslösen Java Basics - Anfänger-Themen 9
J JLabel mit Hilfe von JTextfield benennen Java Basics - Anfänger-Themen 7
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
M JTextField Java Basics - Anfänger-Themen 7
O JTextField Schriftgröße ändern Java Basics - Anfänger-Themen 1
J Nur ein Komma in JTextField zulassen... Java Basics - Anfänger-Themen 9
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben