2015-11-27 3 views
4

Это мой тестовый код текстового поля добавить текст,Textarea ScrollPane держать в тексте добавить

public class TextAreaScrollHold extends Application { 

    TextArea area = new TextArea(); 

    @Override 
    public void start(Stage primaryStage) { 
     StackPane root = new StackPane(); 
     root.getChildren().add(area); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     addTextInTextArea(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public void addTextInTextArea() { 
     for (int i = 0; i < 15; i++) { 
      area.appendText("Hello World " + i + "\n"); 
     } 

     Task<Void> task = new Task() { 
      @Override 
      protected Void call() throws Exception { 
       for (int i = 15; i < 100; i++) { 
        area.appendText("Hello World " + i + "\n"); 
        Thread.sleep(1000); 
       } 

       return null; 
      } 
     }; 
     new Thread(task).start(); 
    } 

} 

Это моя данные кода будет обновляться в потоке. Мне нужно, как удерживать в полосе прокрутки при обновлении данных в textarea. У меня есть JavaFX TextArea and autoscroll и Access to TextArea's Scroll Pane or Scroll Bars, но как решить эти проблемы.

Мне нужно

  • Когда обновление данных в текстовое поле, я буду прокручивать область текста прокрутки бар будет держать.

    textArea.scrollTopProperty().addListener(new ChangeListener<Number>() { 
          @Override 
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
            textArea.setScrollTop(100); 
          } 
         }); 
    

Я использовал этот код, но полосы прокрутки в не перемещается строке будет зафиксирована в пикселе 100 позиций

ответ

1

Вы можете использовать getCaretPostion и postionCaret (да, имя его метод сеттер является неуклюжим для Java) ,

Я быстро подготовил некоторый код для вас, используйте кнопку блокировки прокрутки, чтобы включить/отключить скроллинг:

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.ToggleButton; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class ConsoleDemo extends Application { 

    Console console = new Console(); 

    @Override 
    public void start(Stage primaryStage) { 

     StackPane root = new StackPane(); 
     root.getChildren().add(console); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Console Demo"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     addTextInTextArea(); 
    } 

    /** 
    * @param args 
    *   the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public void addTextInTextArea() { 
     for (int i = 0; i < 15; i++) { 
      console.log("Hello World " + i); 
     } 

     Task<Void> task = new Task() { 
      @Override 
      protected Void call() throws Exception { 
       for (int i = 15; i < 100; i++) { 
        console.log("Hello World " + i); 
        Thread.sleep(1000); 
       } 

       return null; 
      } 
     }; 
     new Thread(task).start(); 

    } 

    public class Console extends BorderPane { 

     TextArea textArea = new TextArea(); 
     int scrollLockPos = -1; 

     public Console() { 

      HBox toolbar = new HBox(); 

      ToggleButton scrollLockButton = new ToggleButton("Scroll Lock"); 

      scrollLockButton.setOnAction(e -> { 
       if (scrollLockButton.isSelected()) { 
        scrollLockPos = textArea.getCaretPosition(); 
       } else { 
        scrollLockPos = -1; 
       } 
      }); 

      HBox.setMargin(scrollLockButton, new Insets(5, 5, 5, 5)); 
      toolbar.getChildren().add(scrollLockButton); 

      setCenter(textArea); 
      setTop(toolbar); 

     } 

     public void log(String text) { 

      textArea.appendText(text + "\n"); 

      if (scrollLockPos != -1) { 
       textArea.positionCaret(scrollLockPos); 
      } 
     } 
    } 
} 

Не самое хорошим решение, но если вы не хотите использовать выбор в текстовом поле, а это прокрутка заблокирован, этот работает. Для правильного решения вам понадобится доступ к экранам скинов/прокрутки/прокрутки, а также к предстоящей версии Java 9 и ее модуляции вы не знаете, к чему у вас будет доступ, поскольку доступ к ним в настоящее время помечен как «ограниченный».


Edit:

Вот альтернативное решение, которое использует диапазон, консольный компонент только. С помощью этой версии вы можете выбрать текст и сохранить выделение, пока кнопка прокрутки заблокирована:

import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.control.Button; 
import javafx.scene.control.IndexRange; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.ToggleButton; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 

/** 
* Console which provides a mechanism to lock scrolling. Selecting text and copying it works while scrolling is locked. 
*/ 
public class Console extends BorderPane { 

    TextArea textArea = new TextArea(); 
    ToggleButton scrollLockButton; 
    IndexRange range; 

    public Console() { 

     initComponents(); 

    } 

    private void initComponents() { 

     // toolbar 
     HBox toolbar = new HBox(); 
     toolbar.setAlignment(Pos.CENTER_RIGHT); 

     // clear 
     Button clearButton = new Button("Clear"); 
     clearButton.setOnAction(e -> { 
      textArea.clear(); 
     }); 

     // scroll lock 
     scrollLockButton = new ToggleButton("Scroll Lock"); 

     // button positions & layout 
     Insets insets = new Insets(5, 5, 5, 5); 
     HBox.setMargin(clearButton, insets); 
     HBox.setMargin(scrollLockButton, insets); 

     toolbar.getChildren().addAll(clearButton,scrollLockButton); 

     // component layout 
     setCenter(textArea); 
     setTop(toolbar); 

    } 


    public void log(String text) { 

     if (scrollLockButton.isSelected()) { 
      range = textArea.getSelection(); 
     } 

     textArea.appendText(text + "\n"); 

     if (scrollLockButton.isSelected()) { 
      textArea.selectRange(range.getStart(), range.getEnd()); 
     } 
    } 
} 
+0

Спасибо за решение. –

+0

@ Reegan Miranda: проверьте альтернативную версию консоли. Вы можете сохранить состояние выбора с помощью этого и выбрать и скопировать текст, пока прокрутка заблокирована. – Roland

+0

Что такое альтернативная версия консоли. –

Смежные вопросы