2016-05-23 4 views
1

This is how the window looksJavaFX TextFlow - пустой текстовый узел не отображается пустой (ворует символ из соседнего текста)

Проблема здесь в том, что центр Text (синий) должен быть пустым, но по какой-то причине нет. Окно просто очень простое JavaFX Application. Метод запуска выглядит следующим образом:

public void start(Stage stage) { 
    Pane main = new Pane(); 
    TextProgress copy = new TextProgress(); 
    main.getChildren().add(copy); 

    Scene scene = new Scene(main, 300, 200); 
    stage.setTitle("Test"); 
    stage.setScene(scene); 
    stage.show(); 
} 

TextProgress является пользовательский класс, который в основном TextFlow с тремя Text Узлов в нем. Содержимое трех Texts: «Привет», «» (пусто), «Мир». Проблема заключается в том, что, как вы можете видеть на изображении, Text в середине «украл» символ, который находится справа.

Перед тем, как показать код TextProgress, позвольте мне перечислить несколько вещей, которые я нашел во время игры с этим, чтобы сделать код понятным.

  • Весь этот код предназначен для отображения проблемы. Первоначальное приложение было в основном отображением хода копирования текста вручную. Левые Text будут содержать все слова, которые уже были напечатаны, центр Text текущее слово для ввода, а справа Text текст еще не напечатал.
  • Кроме того, центр Text был снова разбит на Text для типизированных и нетипизированных символов для текущего слова. В этом примере «Hello» будет уже введенным словом, пустой Text - это типизированные символы текущего слова, а «World» - это нетипизированные символы текущего слова. (Так как мы ничего не набираем в этом примере, другой Text был опущен.)
  • Причина, по которой я не оставил «Hello», заключается в том, что проблема возникает только в том случае, когда перед центром находится TextText (не имеет значения, пусто или нет).
  • Другой способ предотвратить проблему - обернуть два Texts для текущего слова в другом TextFlow. (Text, TextFlow[Text,Text], Text). Хотя это, похоже, решает проблему, это вызывает другое. При вводе текста и, таким образом, изменении содержимого Texts, перенос слов строки, набираемой в настоящее время, изменяется время от времени, например. длинное слово нажимается на следующую строку при вводе, затем снова возвращается к следующему слову. Обратите внимание, что это происходит, хотя общая длина всего Texts всегда остается неизменной. Это может быть связано с вопросом об этом вопросе?
  • Единственная разница между различными Texts - это цвет. Что касается другой проблемы, упомянутой выше, объясняет ли это изменение смены слов?
  • Проблема произошла только при первом символе текущего слова. Как только центр Text (синий) больше не пуст, все как ожидается.
  • Я убедился, что пустой Text фактически пуст
  • Я добавил некоторые отпечатки для BoundingBox центра Text до и после отображения окна, ширина атрибута здесь 0 до, ~ 28 после.
  • Если два Texts для текущего слова завернуты в другой TextFlow, атрибут width здесь изменяется от 0 до -1. Есть ли способ установить ширину пустого Text на -1 без дополнительных TextFlow?

(не уверен, нужно ли включать только TextProgress класс здесь, или весь Application, так как весь класс мал.)

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.scene.text.TextFlow; 
import javafx.stage.Stage; 

public class Window extends Application { 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage stage) { 
    Pane main = new Pane(); 
    TextProgress copy = new TextProgress(); 
    main.getChildren().add(copy); 

    Scene scene = new Scene(main, 300, 200); 
    stage.setTitle("Test"); 
    stage.setScene(scene); 
    stage.show(); 
} 

private static class TextProgress extends TextFlow { 

    private Text typed; 
    private TextFlow current; 
    private Text currentTyped; 
    private Text currentUntyped; 

    public TextProgress() 
    { 
     double size = 30; 
     boolean wrap = false; 

     typed = new Text(); 
     typed.setFont(Font.font(size)); 
     typed.setFill(Color.ORANGERED); 
     typed.setText("Hello "); 

     currentTyped = new Text(); 
     currentTyped.setFont(Font.font(size)); 
     currentTyped.setFill(Color.DEEPSKYBLUE); 
     currentTyped.setText(""); 
     printDelayed(1000); 

     currentUntyped = new Text(); 
     currentUntyped.setFont(Font.font(size)); 
     currentUntyped.setFill(Color.MEDIUMAQUAMARINE); 
     currentUntyped.setText("World"); 

     if (wrap) { 
      current = new TextFlow(); 
      current.getChildren().addAll(currentTyped, currentUntyped); 
      this.getChildren().addAll(typed, current); 
     } else {     
      this.getChildren().addAll(typed, currentTyped, currentUntyped); 
     } 
    } 

    private void printDelayed(long delay) { 
     System.out.println(currentTyped.getLayoutBounds()); 
     new Thread(() -> { 
      try { 
       Thread.sleep(delay); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      System.out.println(currentTyped.getLayoutBounds()); 
     }).start(); 
    } 
} 
} 

Я ценю любые подсказки относительно того, что здесь происходит. Опять же, главный вопрос здесь заключается в том, как остановить центр Text от отображения некоторого символа из смежного Text.

ответ

0

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

У вас есть TextFlow, который имеет 3 Text (или Label) Node с, соответственно, набранные, нетипизированным , currenttyped, все с начальным текстом " ".

Теперь, когда вы вводите ключевые штрихи, обновляется в типизированном и текущем состоянии, и вы вызываете следующий набор слов и обновляете его до нетипизированного.

поэтому он должен работать, потому что Textflow только горизонтальный, wrappable узел узлов, поэтому если у вас есть Label с или Text с различной Paints все, что вам нужно сделать, это обновление тех соответствующих узлов textProperty(), и я предполагаю, что они будут заворачивать самостоятельно.

Надеюсь, это помогло вам сэр.

+0

Я не совсем уверен, что вы здесь отвечаете, что может быть моей ошибкой, поскольку у меня нет более четкого вопроса. В какой среде упоминается TextFlow? Приложению для ввода требуется не менее 4 текстовых узлов, и не имеет значения, как я обновляю содержимое. Проблема кражи персонажа возникает не только изначально, но и для каждого слова из полного текста (при прогрессировании). Это простое приложение, очевидно, не содержит какой-либо последовательности ввода (поскольку это не относится к проблеме). – Caranown