2012-09-09 39 views
24

En mi aplicación JavaFx necesito tener una palabra o dos en negrita en toda la oración. Actualmente, la oración se representa como una etiqueta JavaFx, pero el componente de actualización tampoco me permite configurar el texto para que las palabras "Muestra" se muestren en negrita.Haga que la porción de un texto sea negrita en una Etiqueta o Texto JavaFx

String s = "This is a <b>Sample</b> sentence" 
Label label = new Label(s); 

salida

This is a Sample sentence

JavaFX texto también no permite esto. ¿Hay algún componente donde pueda tener una parte del texto en negrita?

No estoy seguro si JavaFx WebView es una buena idea para representar muchas oraciones pequeñas en una ventana.

+0

Tenga en cuenta que para un problema relacionado, puede utilizar \ n en lugar de
para tener texto en varias líneas –

Respuesta

9

Actualización: JavaFX 8 ofrece nuevo control para el texto enriquecido: TextFlow


Desafortunadamente no existe tal función en el punto 2.2, aunque puede ser incluido en la próxima versión.

Por ahora se puede intentar utilizar siguientes enfoques:

  1. HBox con varios Label o Text componentes
  2. WebView
  3. la lona con varios componentes de texto dibujado
37

Es posible use el contenedor TextFlow de JavaFX8. A continuación, puede agregar fácilmente nodos Text de diferentes estilos en su interior.

TextFlow flow = new TextFlow(); 

Text text1=new Text("Some Text"); 
text1.setStyle("-fx-font-weight: bold"); 

Text text2=new Text("Some Text"); 
text2.setStyle("-fx-font-weight: regular"); 

flow.getChildren().addAll(text1, text2); 

El contenedor TextFlow automáticamente ajustará el contenido Nodos de texto.

enter image description here

3

Dado que las respuestas anteriores no incluyen código FXML, voy a publicar una adicional.

Según lo sugerido por @Ernisto, puede utilizar un TextFlow que contiene Text partes, donde cada parte se puede diseñar de manera diferente.

el contenido del archivo Ejemplo FXML:

<TextFlow> 
    <Text text="Normal text and "/> 
    <Text text="bold text and " style="-fx-font-weight: bold"/> 
    <Text text="italic text and " style="-fx-font-style: italic"/> 
    <Text text="red text." style="-fx-stroke: red"/> 
</TextFlow> 

salida:

enter image description here

0
public class UtilsDialog { 

    private static final String TAG = "UtilsDialog"; 

    private static boolean sIsShowing = false; 

    public static void showDialogShowError(String title, String msg, String defaultStyle, 
              @Nullable String customStyle, String... styledWords) { 
     if (sIsShowing) return; 

     Stage dialogStage = new Stage(StageStyle.UTILITY); 
     dialogStage.initModality(Modality.APPLICATION_MODAL); 
     dialogStage.setWidth(400); 
     dialogStage.setHeight(220); 

     BorderPane borderPane = new BorderPane(); 

     borderPane.setPadding(new Insets(15)); 
     borderPane.setPrefWidth(Integer.MAX_VALUE); 
     borderPane.setPrefHeight(Integer.MAX_VALUE); 

     Scene scene = new Scene(borderPane); 
     dialogStage.setScene(scene); 
     sIsShowing = true; 
     dialogStage.show(); 
     UtilsGui.closeOnEsc(borderPane, scene); 
     scene.addEventHandler(KeyEvent.KEY_PRESSED, t -> { 
      if (t.getCode() == KeyCode.ESCAPE) { 
       sIsShowing = false; 
      } 
     }); 

     // Top 
     Text textTitle = new Text(title); 
     textTitle.setStyle("-fx-font-size: 18px;"); 

     HBox hBoxTop = new HBox(10); 
     hBoxTop.getChildren().addAll(textTitle); 
     borderPane.setTop(hBoxTop); 

     // Center 
     TextFlow textFlow = new TextFlow(); 
     List<String> words = Arrays.asList(msg.split(" ")); 
     List<String> styledWordsList = Arrays.asList(styledWords); 
     for (String word : words) { 
      Text tmpWord = new Text(word); 
      if (styledWordsList.contains(word 
        .replace(".", "") 
        .replace(",", "") 
        .replace("?", "") 
        .replace("!", "") 
        .replace(";", "") 
        .replace("\n", "") 
      )) { 

       tmpWord.setStyle(customStyle); 
      } else { 
       if (defaultStyle == null) { 
        tmpWord.setStyle(""); 
       } else { 
        tmpWord.setStyle(defaultStyle); 
       } 
      } 
      tmpWord.setText(tmpWord.getText()); 
      textFlow.getChildren().add(tmpWord); 
      textFlow.getChildren().add(new Text(" ")); 
     } 
     Text textMsg = new Text(msg); 
     textMsg.setStyle("-fx-font-size: 14px;"); 
     HBox hBoxInputPane = new HBox(10); 
     hBoxInputPane.setAlignment(Pos.CENTER); 

     VBox vBoxCenter = new VBox(10); 
     vBoxCenter.setPadding(new Insets(25, 0, 15, 0)); 
     vBoxCenter.getChildren().addAll(textFlow); 
     borderPane.setCenter(vBoxCenter); 

     JFXButton btnOk = new JFXButton("OK"); 
     btnOk.setAlignment(Pos.CENTER_RIGHT); 
     btnOk.setStyle("-fx-text-fill: WHITE; -fx-background-color: #5264AE; -fx-font-size: 14px;"); 
     btnOk.setOnAction(event -> { 
      sIsShowing = false; 
      dialogStage.close(); 
     }); 

     // Bottom 
     HBox hBoxBottom = new HBox(); 
     final Pane spacer = new Pane(); 
     HBox.setHgrow(spacer, Priority.ALWAYS); 
     hBoxBottom.getChildren().addAll(spacer, btnOk); 
     borderPane.setBottom(hBoxBottom); 

     // store on close 
     dialogStage.setOnCloseRequest(event -> sIsShowing = false); 
    } 
} 

llamada:

UtilsDialog.showDialogShowError("Test", "This is the message to show. Does it work?", 
       null, "-fx-font-weight: bold", "This", "message", "show"); 
Cuestiones relacionadas