2012-09-09 18 views
24

Nella mia applicazione JavaFx ho bisogno di avere una parola o due resi in grassetto nell'intera frase. Attualmente la frase è resa come un'etichetta JavaFx ma il componente di aggiornamento non mi permetterebbe di impostare il testo in modo tale da poter visualizzare in grassetto le parole "Sample".Rendi grassetto una porzione di testo in un'etichetta o testo JavaFx

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

uscita

This is a Sample sentence

JavaFX testo, inoltre, non consente questo. C'è qualche componente in cui posso avere una parte del testo in grassetto?

Non sono sicuro che JavaFx WebView sia una buona idea per il rendering di molte piccole frasi in una finestra.

+0

Si noti che per un problema correlato, è possibile utilizzare \ n invece di
per avere testo su più righe –

risposta

9

Aggiornamento: JavaFX 8 fornisce nuovo controllo per il rich text: TextFlow


purtroppo non v'è alcuna funzionalità di tale in 2.2, anche se può essere incluso nella prossima release.

Per ora si può provare a utilizzare prossimi approcci:

  1. HBOX con diversi Label o Text componenti
  2. WebView
  3. su tela con diversi componenti testo elaborato
37

E 'possibile utilizzare il contenitore TextFlow da JavaFX8. Quindi è possibile aggiungere facilmente nodi dallo stile diverso allo Text al suo interno.

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); 

Il contenitore TextFlow comprimerà automaticamente i nodi di testo.

enter image description here

3

Dal momento che le risposte precedenti non includono il codice FXML, vi posterò uno supplementare.

Come suggerito da @Ernisto, è possibile utilizzare uno TextFlow che contiene Text parti, in cui ciascuna parte può avere uno stile diverso.

contenuto del file Esempio 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> 

uscita:

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); 
    } 
} 

chiamata:

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