2012-11-19 69 views
2

实际上我正在寻找非常相似,这个线程的东西:JavaFX的HTML编辑器

How to hide the controls of HTMLEditor?

所以基本上我尝试自定义按钮添加到JavaFX的HTML编辑器,但不同之处在于它是通过实施FXML。

所以我的问题是:

是否有一个“变通”,当它通过FXML实现的自定义按钮添加到HTML编辑器?

回答

2

这里是一些sample code定制HTMLEditor并添加一个自定义按钮。示例代码不使用fxml,但如果使用fxml,它确实非常相似。您可以在fxml中定义HTMLEditor,并使用标准@FXML注释将其注入到Controller中。一旦你有了对编辑器的引用,就可以使用适当的示例代码变体在Java代码中定制它。对于添加的按钮,只需使用Java创建而不是使用fxml,这将更简单。

+0

谢谢,现在我得到了线索! :) – fraggle

+0

这给我带来了与此相关的另一个问题 - 是否可以在顶部工具栏和底部工具栏下添加另一个工具栏? – fraggle

+0

我已经使它适用于javaFX9,看到我的答案,如果你想更新你的要点。感谢你为我提供了很多帮助,特别是字体。请给 – pdem

-1

样品溶液:

htmlEditor.setVisible(false); 
    Platform.runLater(new Runnable() { 

     @Override 
     public void run() { 
      Node[] nodes = htmlEditor.lookupAll(".tool-bar").toArray(new Node[0]); 
      for (Node node : nodes) { 
       node.setVisible(false); 
       node.setManaged(false); 
      } 
      htmlEditor.setVisible(true); 
     } 

    }); 
+2

添加一些解释给你的代码。 –

0

我已经修改了javaFX9的@jewelsea答案。

我也添加了一些自定义来移动工具栏。主要想法是通过CSS选择器获取所有组件,然后修改或隐藏它们。阅读HTMLEditorSkin类以获取CSS类名称,例如对齐按钮的“.html-editor-align-center”。

import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 
import java.util.concurrent.atomic.AtomicBoolean; 
import java.util.regex.Pattern; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.MenuButton; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.RadioMenuItem; 
import javafx.scene.control.ToolBar; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.GridPane; 
import javafx.scene.web.HTMLEditor; 
import javafx.stage.Stage; 

public class HTMLEditorCustomizationSample2 extends Application { 
    // limits the fonts a user can select from in the html editor. 
    private static final ObservableList<String> limitedFonts = FXCollections.observableArrayList("Arial", 
      "Times New Roman", "Courier New", "Comic Sans MS"); 
    private HTMLEditor htmlEditor; 

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

    @SuppressWarnings("unchecked") 
    @Override 
    public void start(Stage stage) { 
     htmlEditor = new HTMLEditor(); 
     stage.setScene(new Scene(htmlEditor)); 
     stage.show(); 

     customizeEditor(htmlEditor); 

    } 

    private void customizeEditor(HTMLEditor htmlEditor) { 
     // hide controls we don't need. 
     Node seperator = htmlEditor.lookup(".separator"); 
     seperator.setVisible(false); 
     seperator.setManaged(false); 
     hideByClass(htmlEditor, ".separator"); 
     hideByClass(htmlEditor, ".html-editor-cut", ".html-editor-copy", ".html-editor-paste", ".html-editor-strike", 
       ".html-editor-hr"); 
     hideByClass(htmlEditor, ".html-editor-align-left" 
       , ".html-editor-align-center" 
       , ".html-editor-align-right" 
       , ".html-editor-align-justify", ".html-editor-outdent" 
       , ".html-editor-indent", ".html-editor-bullets" 
       , ".html-editor-numbers"); 
     // Move the toolbars 
     Node top= htmlEditor.lookup(".top-toolbar"); 
     GridPane.setConstraints(top,1,0,1,1); 
     Node bottom= htmlEditor.lookup(".bottom-toolbar"); 
     GridPane.setConstraints(bottom,0,0,1,1); 
     Node web= htmlEditor.lookup("WebView"); 
     GridPane.setConstraints(web,0,1,2,1); 

     // modify font selections. 
     int i = 0; 
     Set<Node> fonts = htmlEditor.lookupAll(".font-menu-button"); 
     Iterator<Node> fontsIterator = fonts.iterator(); 
     fontsIterator.next(); 
     ComboBox<String> formatComboBox = (ComboBox<String>) fontsIterator.next(); 

     formatComboBox.itemsProperty().addListener((obs, old, value) -> { 
      if (value.size() != limitedFonts.size()) {// should loop on array for equality 
       Platform.runLater(() -> { 
        value.clear(); 
        // stop.set(true); 
        value.addAll(limitedFonts); 
        formatComboBox.setValue(limitedFonts.get(0)); 
       }); 

      } 
     }); 

     // add a custom button to the top toolbar. 
     Node node = htmlEditor.lookup(".top-toolbar"); 
     if (node instanceof ToolBar) { 
      ToolBar bar = (ToolBar) node; 
      ImageView graphic = new ImageView(
        new Image("http://bluebuddies.com/gallery/title/jpg/Smurf_Fun_100x100.jpg", 16 , 16, true, true)); 
      graphic.setEffect(new DropShadow()); 
      Button smurfButton = new Button("", graphic); 
      bar.getItems().add(smurfButton); 
      smurfButton.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent arg0) { 
        htmlEditor.setHtmlText("<font face='Comic Sans MS' color='blue'>Smurfs are having fun :-)</font>"); 
       } 
      }); 
     } 
    } 

    private void hideByClass(HTMLEditor htmlEditor, String... selectors) { 
     for (String selector : selectors) { 
      Set<Node> nodes = htmlEditor.lookupAll(selector); 
      for (Node node : nodes) { 
       node.setVisible(false); 
       node.setManaged(false); 
      } 
     } 
    } 



    @Override 
    public void stop() throws Exception { 

     super.stop(); 
     System.out.println(htmlEditor.getHtmlText()); 
    } 

}