实际上我正在寻找非常相似,这个线程的东西:JavaFX的HTML编辑器
How to hide the controls of HTMLEditor?
所以基本上我尝试自定义按钮添加到JavaFX的HTML编辑器,但不同之处在于它是通过实施FXML。
所以我的问题是:
是否有一个“变通”,当它通过FXML实现的自定义按钮添加到HTML编辑器?
实际上我正在寻找非常相似,这个线程的东西:JavaFX的HTML编辑器
How to hide the controls of HTMLEditor?
所以基本上我尝试自定义按钮添加到JavaFX的HTML编辑器,但不同之处在于它是通过实施FXML。
所以我的问题是:
是否有一个“变通”,当它通过FXML实现的自定义按钮添加到HTML编辑器?
这里是一些sample code定制HTMLEditor并添加一个自定义按钮。示例代码不使用fxml,但如果使用fxml,它确实非常相似。您可以在fxml中定义HTMLEditor,并使用标准@FXML
注释将其注入到Controller
中。一旦你有了对编辑器的引用,就可以使用适当的示例代码变体在Java代码中定制它。对于添加的按钮,只需使用Java创建而不是使用fxml,这将更简单。
样品溶液:
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);
}
});
添加一些解释给你的代码。 –
我已经修改了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());
}
}
谢谢,现在我得到了线索! :) – fraggle
这给我带来了与此相关的另一个问题 - 是否可以在顶部工具栏和底部工具栏下添加另一个工具栏? – fraggle
我已经使它适用于javaFX9,看到我的答案,如果你想更新你的要点。感谢你为我提供了很多帮助,特别是字体。请给 – pdem