Javafx 2 如何隐藏HTMLEditor的控件?
是否可以将HTMLEditor的控件隐藏在实际文本之上?(对齐、复制和粘贴图标、样式等)Javafx 2 如何隐藏HTMLEditor的控件?,javafx-2,Javafx 2,是否可以将HTMLEditor的控件隐藏在实际文本之上?(对齐、复制和粘贴图标、样式等) 感谢您的帮助根据官方教程,您似乎无法使用 在的实现中提供了格式工具栏 组成部分。不能切换它们的可见性。然而,你仍然可以 通过应用CSS样式自定义编辑器的外观 如果使用不支持的方法,则可以非常轻松地自定义工具栏 正如乌鲁克在回答中所说,以下方法没有得到官方支持 import java.util.regex.Pattern; import javafx.application.Application; impo
感谢您的帮助根据官方教程,您似乎无法使用 在的实现中提供了格式工具栏 组成部分。不能切换它们的可见性。然而,你仍然可以 通过应用CSS样式自定义编辑器的外观
如果使用不支持的方法,则可以非常轻松地自定义工具栏 正如乌鲁克在回答中所说,以下方法没有得到官方支持
import java.util.regex.Pattern;
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.image.ImageView;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;
public class HTMLEditorSample extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
final HTMLEditor htmlEditor = new HTMLEditor();
stage.setScene(new Scene(htmlEditor));
stage.show();
hideImageNodesMatching(htmlEditor, Pattern.compile(".*(Cut|Copy|Paste).*"), 0);
Node seperator = htmlEditor.lookup(".separator");
seperator.setVisible(false); seperator.setManaged(false);
}
public void hideImageNodesMatching(Node node, Pattern imageNamePattern, int depth) {
if (node instanceof ImageView) {
ImageView imageView = (ImageView) node;
String url = imageView.getImage().impl_getUrl();
if (url != null && imageNamePattern.matcher(url).matches()) {
Node button = imageView.getParent().getParent();
button.setVisible(false); button.setManaged(false);
}
}
if (node instanceof Parent)
for (Node child : ((Parent) node).getChildrenUnmodifiable())
hideImageNodesMatching(child, imageNamePattern, depth + 1);
}
}
如果有人真的想用一种不受支持的方式隐藏工具栏,那么有一种更简单的方法来实现(我还没有测试过这是否会导致HtmleEditor控件出现任何问题,所以使用它的风险由您自己承担)
package-htmleditor-sample;
导入javafx.application.application;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.web.HTMLEditor;
导入javafx.stage.stage;
公共类HTMLEditorSample扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
最终HTMLEditor HTMLEditor=新HTMLEditor();
设置场景(新场景(htmlEditor));
primaryStage.show();
对于(节点工具栏=htmlEditor.lookup(.tool bar”);工具栏!=null;工具栏=htmlEditor.lookup(.tool bar”)){
((窗格)toolBar.getParent()).getChildren().remove(工具栏);
}
}
}
不透明度可以工作,但菜单保持活动状态。我已经制作了一些函数来修改HTML编辑器(以获得它的最低版本),也许其他人也会想使用它 守则:
import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import com.sun.javafx.scene.web.skin.PopupButton;
public class HTMLEditorModifyer extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
final HTMLEditor htmlEditor = new HTMLEditor();
stage.setScene(new Scene(htmlEditor));
stage.setWidth(300);
stage.setHeight(200);
stage.show();
addCustomToolBarTo(htmlEditor);
printChildren(htmlEditor, 20);
moveFromTo(htmlEditor, "PopupButton", 0, "ToolBar", 2);
moveFromTo(htmlEditor, "PopupButton", 1, "ToolBar", 2);
moveFromTo(htmlEditor, "Separator", 4, "ToolBar", 2);
moveFromTo(htmlEditor, "ComboBox", 2, "ToolBar", 2);
moveFromTo(htmlEditor, "Separator", 5, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 6, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 7, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 8, "ToolBar", 2);
removeFrom(htmlEditor, "ToolBar", 1);
removeFrom(htmlEditor, "ToolBar", 0);
//printChildren(htmlEditor, 20);
}
public void moveFromTo(HTMLEditor he, String t, int c, String t2, int c2)
{
Node nCb = new Button(); //just has to be sth.
//Copy From:
int i = 0;
switch(t)
{
case "PopupButton":
for (Node candidate: (he.lookupAll("PopupButton")))
{
if (candidate instanceof PopupButton)
{
PopupButton cb = (PopupButton) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "Separator":
for (Node candidate: (he.lookupAll("Separator")))
{
if (candidate instanceof Separator)
{
Separator cb = (Separator) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "ComboBox":
for (Node candidate: (he.lookupAll("ComboBox")))
{
if (candidate instanceof ComboBox)
{
ComboBox cb = (ComboBox) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "ToggleButton":
for (Node candidate: (he.lookupAll("ToggleButton")))
{
if (candidate instanceof ToggleButton)
{
ToggleButton cb = (ToggleButton) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
}
//Copy To:
i = 0;
switch(t2)
{
case "ToolBar":
for (Node candidate: (he.lookupAll("ToolBar")))
{
if (candidate instanceof ToolBar)
{
ToolBar cb2 = (ToolBar) candidate;
if (i == c2)
{
cb2.getItems().add(nCb);
break;
}
}
i++;
}
break;
}
}
public void removeFrom(HTMLEditor he, String t, int c)
{
int i = 0;
switch(t)
{
case "ToolBar":
for (Node candidate: (he.lookupAll("ToolBar")))
{
if (candidate instanceof ToolBar)
{
ToolBar cb = (ToolBar) candidate;
if (i == c)
{
Node nCb = cb;
((Pane) nCb.getParent()).getChildren().remove(nCb);
break;
}
}
i++;
}
break;
case "PopupButton":
for (Node candidate: (he.lookupAll("PopupButton")))
{
if (i == c)
{
Node nCb = candidate;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
i++;
}
break;
case "ToggleButton":
for (Node candidate: (he.lookupAll("ToggleButton")))
{
if (candidate instanceof ToggleButton)
{
ToggleButton cb = (ToggleButton) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "Separator":
for (Node candidate: (he.lookupAll("Separator")))
{
if (candidate instanceof Separator)
{
Separator cb = (Separator) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "Button":
for (Node candidate: (he.lookupAll("Button")))
{
if (candidate instanceof Button)
{
Button cb = (Button) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "ComboBox":
for (Node candidate: (he.lookupAll("ComboBox")))
{
if (candidate instanceof ComboBox)
{
ComboBox cb = (ComboBox) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
}
}
public void printChildren(HTMLEditor he, int MAXDEPTH)
{
System.out.println("Print Children ==========>>>>");
String[] hieraArray = new String[MAXDEPTH];
int maxDepth = 0;
int lastDepth = 0;
Node parent;
/* List all elements of the HTMLeditor */
for (Node element: (he.lookupAll("*")))
{
parent = element.getParent();
if (maxDepth == 0)
{
hieraArray[0] = element.getClass().getSimpleName().toString();
System.out.print(hieraArray[0]);
System.out.println("");
maxDepth = 1;
}
else
{
int i = 0, i2 = 0;
boolean found = false;
for(i=maxDepth; i>=0; i--)
{
if (hieraArray[i] == null || parent.getClass().getSimpleName() == null) continue;
if (hieraArray[i].equals(parent.getClass().getSimpleName()))
{
for (i2 = 0; i2 <= i; i2++)
{
System.out.print("|");
}
if ((Math.abs(lastDepth-i2)) > 2) System.out.print("->" + element.getClass().getSimpleName() + " {p: " + parent.getClass().getSimpleName() + "}");
else System.out.print("->" + element.getClass().getSimpleName());
//if (element.getClass().getSimpleName().equals("PopupButton")) System.out.print(" ??: " + element + " ::: " + element.getClass());
lastDepth = i2;
hieraArray[(i+1)] = element.getClass().getSimpleName();
if (maxDepth < (i+1)) maxDepth = (i+1);
found = true;
System.out.println("");
break;
}
}
if (found == false)
{
hieraArray[(i+1)] = parent.getClass().getSimpleName();
if (maxDepth < (i+1)) maxDepth = (i+1);
}
if ((maxDepth+1) >= MAXDEPTH)
{
System.out.println("MAXDEPTH reached! increase ArraySize!");
return;
}
}
}
}
public ToolBar addCustomToolBarTo(HTMLEditor he)
{
/* Thers one GridPane to the HTMLEditor where we add the ToolBar */
ToolBar customTB = new ToolBar();
for (Node candidate: (he.lookupAll("GridPane")))
{
if (candidate instanceof GridPane)
{
((GridPane) candidate).getChildren().add(customTB);
break;
}
}
return customTB;
}
}
导入javafx.application.*;
导入javafx.scene.*;
导入javafx.scene.control.*;
导入javafx.scene.web.HTMLEditor;
导入javafx.stage.stage;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Pane;
导入com.sun.javafx.scene.web.skin.popubutton;
公共类HTMLEditorModifyer扩展了应用程序{
公共静态void main(字符串[]args){launch(args);}
@覆盖公共无效开始(阶段){
最终HTMLEditor HTMLEditor=新HTMLEditor();
stage.setScene(新场景(htmlEditor));
舞台设置宽度(300);
舞台设置高度(200);
stage.show();
添加自定义工具栏到(htmlEditor);
printChildren(htmlEditor,20);
moveFromTo(htmlEditor,“弹出按钮”,0,“工具栏”,2);
moveFromTo(htmlEditor,“弹出按钮”,1,“工具栏”,2);
moveFromTo(htmlEditor,“分隔符”,4,“工具栏”,2);
moveFromTo(htmlEditor,“组合框”,2,“工具栏”,2);
moveFromTo(htmlEditor,“分隔符”,5,“工具栏”,2);
moveFromTo(htmlEditor,“切换按钮”,6,“工具栏”,2);
moveFromTo(htmlEditor,“切换按钮”,7,“工具栏”,2);
moveFromTo(htmlEditor,“切换按钮”,8,“工具栏”,2);
移除(htmlEditor,“工具栏”,1);
移除(htmlEditor,“工具栏”,0);
//printChildren(htmlEditor,20);
}
public void moveFromTo(HTMLEditor he、字符串t、int c、字符串t2、int c2)
{
Node nCb=new Button();//必须是sth。
//复制自:
int i=0;
开关(t)
{
案例“弹出按钮”:
对于(节点候选:(he.lookupAll(“popubutton”))
{
if(弹出按钮的候选实例)
{
PopupButton cb=(PopupButton)候选者;
如果(i==c)
{
nCb=cb;
打破
}
}
i++;
}
打破
案例“分隔符”:
for(节点候选:(he.lookupAll(“分隔符”))
{
if(分隔符的候选实例)
{
分隔符cb=(分隔符)候选;
如果(i==c)
{
nCb=cb;
打破
}
}
i++;
}
打破
案例“组合框”:
对于(候选节点:(he.lookupAll(“组合框”))
{
if(组合框的候选实例)
{
组合框cb=(组合框)候选;
如果(i==c)
{
nCb=cb;
打破
}
}
i++;
}
打破
案例“切换按钮”:
对于(候选节点:(he.lookupAll(“ToggleButton”))
{
if(候选实例切换按钮)
{
ToggleButton cb=(ToggleButton)候选者;
如果(i==c)
{
nCb=cb;
打破
}
}
i++;
}
打破
}
//抄送:
i=0;
开关(t2)
{
案例“工具栏”:
对于(候选节点:(he.lookupAll(“工具栏”))
{
if(工具栏的候选实例)
{
工具栏cb2=(工具栏)候选;
如果(i==c2)
{
cb2.getItems().add(nCb);
打破
import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import com.sun.javafx.scene.web.skin.PopupButton;
public class HTMLEditorModifyer extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
final HTMLEditor htmlEditor = new HTMLEditor();
stage.setScene(new Scene(htmlEditor));
stage.setWidth(300);
stage.setHeight(200);
stage.show();
addCustomToolBarTo(htmlEditor);
printChildren(htmlEditor, 20);
moveFromTo(htmlEditor, "PopupButton", 0, "ToolBar", 2);
moveFromTo(htmlEditor, "PopupButton", 1, "ToolBar", 2);
moveFromTo(htmlEditor, "Separator", 4, "ToolBar", 2);
moveFromTo(htmlEditor, "ComboBox", 2, "ToolBar", 2);
moveFromTo(htmlEditor, "Separator", 5, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 6, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 7, "ToolBar", 2);
moveFromTo(htmlEditor, "ToggleButton", 8, "ToolBar", 2);
removeFrom(htmlEditor, "ToolBar", 1);
removeFrom(htmlEditor, "ToolBar", 0);
//printChildren(htmlEditor, 20);
}
public void moveFromTo(HTMLEditor he, String t, int c, String t2, int c2)
{
Node nCb = new Button(); //just has to be sth.
//Copy From:
int i = 0;
switch(t)
{
case "PopupButton":
for (Node candidate: (he.lookupAll("PopupButton")))
{
if (candidate instanceof PopupButton)
{
PopupButton cb = (PopupButton) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "Separator":
for (Node candidate: (he.lookupAll("Separator")))
{
if (candidate instanceof Separator)
{
Separator cb = (Separator) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "ComboBox":
for (Node candidate: (he.lookupAll("ComboBox")))
{
if (candidate instanceof ComboBox)
{
ComboBox cb = (ComboBox) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
case "ToggleButton":
for (Node candidate: (he.lookupAll("ToggleButton")))
{
if (candidate instanceof ToggleButton)
{
ToggleButton cb = (ToggleButton) candidate;
if (i == c)
{
nCb = cb;
break;
}
}
i++;
}
break;
}
//Copy To:
i = 0;
switch(t2)
{
case "ToolBar":
for (Node candidate: (he.lookupAll("ToolBar")))
{
if (candidate instanceof ToolBar)
{
ToolBar cb2 = (ToolBar) candidate;
if (i == c2)
{
cb2.getItems().add(nCb);
break;
}
}
i++;
}
break;
}
}
public void removeFrom(HTMLEditor he, String t, int c)
{
int i = 0;
switch(t)
{
case "ToolBar":
for (Node candidate: (he.lookupAll("ToolBar")))
{
if (candidate instanceof ToolBar)
{
ToolBar cb = (ToolBar) candidate;
if (i == c)
{
Node nCb = cb;
((Pane) nCb.getParent()).getChildren().remove(nCb);
break;
}
}
i++;
}
break;
case "PopupButton":
for (Node candidate: (he.lookupAll("PopupButton")))
{
if (i == c)
{
Node nCb = candidate;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
i++;
}
break;
case "ToggleButton":
for (Node candidate: (he.lookupAll("ToggleButton")))
{
if (candidate instanceof ToggleButton)
{
ToggleButton cb = (ToggleButton) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "Separator":
for (Node candidate: (he.lookupAll("Separator")))
{
if (candidate instanceof Separator)
{
Separator cb = (Separator) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "Button":
for (Node candidate: (he.lookupAll("Button")))
{
if (candidate instanceof Button)
{
Button cb = (Button) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
case "ComboBox":
for (Node candidate: (he.lookupAll("ComboBox")))
{
if (candidate instanceof ComboBox)
{
ComboBox cb = (ComboBox) candidate;
if (i == c)
{
Node nCb = cb;
nCb.setVisible(false); nCb.setManaged(false);
break;
}
}
i++;
}
break;
}
}
public void printChildren(HTMLEditor he, int MAXDEPTH)
{
System.out.println("Print Children ==========>>>>");
String[] hieraArray = new String[MAXDEPTH];
int maxDepth = 0;
int lastDepth = 0;
Node parent;
/* List all elements of the HTMLeditor */
for (Node element: (he.lookupAll("*")))
{
parent = element.getParent();
if (maxDepth == 0)
{
hieraArray[0] = element.getClass().getSimpleName().toString();
System.out.print(hieraArray[0]);
System.out.println("");
maxDepth = 1;
}
else
{
int i = 0, i2 = 0;
boolean found = false;
for(i=maxDepth; i>=0; i--)
{
if (hieraArray[i] == null || parent.getClass().getSimpleName() == null) continue;
if (hieraArray[i].equals(parent.getClass().getSimpleName()))
{
for (i2 = 0; i2 <= i; i2++)
{
System.out.print("|");
}
if ((Math.abs(lastDepth-i2)) > 2) System.out.print("->" + element.getClass().getSimpleName() + " {p: " + parent.getClass().getSimpleName() + "}");
else System.out.print("->" + element.getClass().getSimpleName());
//if (element.getClass().getSimpleName().equals("PopupButton")) System.out.print(" ??: " + element + " ::: " + element.getClass());
lastDepth = i2;
hieraArray[(i+1)] = element.getClass().getSimpleName();
if (maxDepth < (i+1)) maxDepth = (i+1);
found = true;
System.out.println("");
break;
}
}
if (found == false)
{
hieraArray[(i+1)] = parent.getClass().getSimpleName();
if (maxDepth < (i+1)) maxDepth = (i+1);
}
if ((maxDepth+1) >= MAXDEPTH)
{
System.out.println("MAXDEPTH reached! increase ArraySize!");
return;
}
}
}
}
public ToolBar addCustomToolBarTo(HTMLEditor he)
{
/* Thers one GridPane to the HTMLEditor where we add the ToolBar */
ToolBar customTB = new ToolBar();
for (Node candidate: (he.lookupAll("GridPane")))
{
if (candidate instanceof GridPane)
{
((GridPane) candidate).getChildren().add(customTB);
break;
}
}
return customTB;
}
}
public static void hideHTMLEditorToolbars(final HTMLEditor editor)
{
editor.setVisible(false);
Platform.runLater(new Runnable()
{
@Override
public void run()
{
Node[] nodes = editor.lookupAll(".tool-bar").toArray(new Node[0]);
for(Node node : nodes)
{
node.setVisible(false);
node.setManaged(false);
}
editor.setVisible(true);
}
});
}
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.control.ToolBar;
import javafx.scene.web.HTMLEditor;
import java.util.ArrayList;
import java.util.HashSet;
public class MinimalHTMLEditor extends HTMLEditor {
public MinimalHTMLEditor() {
super();
customizeHtmlEditor(this);
}
public static void customizeHtmlEditor(final HTMLEditor editor) {
editor.setVisible(false);
Platform.runLater(() -> {
ToolBar toolBar1 = (ToolBar) editor.lookup(".top-toolbar");
ToolBar toolBar2 = (ToolBar) editor.lookup(".bottom-toolbar");
HashSet<Node> nodesToKeep = new HashSet<>();
nodesToKeep.add(editor.lookup(".html-editor-numbers"));
nodesToKeep.add(editor.lookup(".html-editor-bullets"));
nodesToKeep.add(editor.lookup(".html-editor-foreground"));
nodesToKeep.add(editor.lookup(".html-editor-background"));
nodesToKeep.add(editor.lookup(".html-editor-bold"));
nodesToKeep.add(editor.lookup(".html-editor-italics"));
nodesToKeep.add(editor.lookup(".html-editor-underline"));
nodesToKeep.add(editor.lookup(".html-editor-strike"));
toolBar1.getItems().removeIf(n -> !nodesToKeep.contains(n));
toolBar2.getItems().removeIf(n -> !nodesToKeep.contains(n));
ArrayList<Node> toCopy = new ArrayList<>();
toCopy.addAll(toolBar2.getItems());
toolBar2.getItems().clear();
toolBar1.getItems().addAll(toCopy);
toolBar2.setVisible(false);
toolBar2.setManaged(false);
editor.setVisible(true);
});
}
}
.html-editor-copy {
visibility: hidden;
}