NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: JavaFX - Jak zjistiti číslo aktuálního řádku v TextArea

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
David J.
Člen
Avatar
David J.:21.2.2018 14:22

Dobrý den.
Chtěl bych se zeptal, jestli někoho nenapadá způsob, jakým by se dalo zjistit aktuální číslo řádku v TextArea na které se právě nachází kurzor. Momentálně jsem schopný zjistit pouze celkový počet řádků, ale nenepadá mě způsob, jak docílit toho aktuálního.
Předem děkuji za radu.

 
Odpovědět
21.2.2018 14:22
Avatar
Neználek
Člen
Avatar
Odpovídá na David J.
Neználek:21.2.2018 21:25

Pozice kurzoru se dá zjistit metodou getCaretPosition().

Příklad:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;

public class TextAreaPositionDemo {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();

        final JTextArea textArea = new JTextArea();
        textArea.addCaretListener(new CaretListener() {
            @Override
            public void caretUpdate(CaretEvent event) {
                int caretPosition = textArea.getCaretPosition();
                try {
                    int line = textArea.getLineOfOffset(caretPosition);
                    int column = caretPosition - textArea.getLineStartOffset(line);
                    frame.setTitle((line + 1) + " : " + (column + 1));
                } catch (BadLocationException e) {
                }
            }
        });

        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        frame.setMinimumSize(new Dimension(200, 200));
        frame.setLocationRelativeTo(null);
        frame.add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}
 
Nahoru Odpovědět
21.2.2018 21:25
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Neználek
Lubor Pešek:21.2.2018 23:53

Hezký kód, ale ptal se na FX, nebo ne?

Editováno 21.2.2018 23:54
Nahoru Odpovědět
21.2.2018 23:53
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David J.
Člen
Avatar
David J.:22.2.2018 9:14

No ano v FX tudíž řešení ve Swingu nejde aplikovat.

 
Nahoru Odpovědět
22.2.2018 9:14
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na David J.
Lubor Pešek:22.2.2018 9:31

no jde, ale je to čuňárna. cca 3 měsíce zpátky jsem se na to tady ptal, a David Čápka mi na to odpověděl - https://www.itnetwork.cz/…9fc49b9e2ab5

Nahoru Odpovědět
22.2.2018 9:31
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David J.
Člen
Avatar
David J.:23.2.2018 17:39

Tak nápad nakonec přeci jen přišel. Řešeno teda přes listener na caretu.

@FXML
    private void AktualRad(){

        getTxtAreaVych().caretPositionProperty().addListener((observable, oldValue, newValue) -> {{
            String radek[] = getTxtAreaVych().getText(0, newValue.intValue()).replaceAll(""," ").split("\n");
            aktualRadek.setText("Řádek číslo: "+radek.length);
        }
        });
    }
 
Nahoru Odpovědět
23.2.2018 17:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.