如何隐藏HTMLEditor的控件?

15

是否有可能隐藏HTMLEditor上方的控件?(对齐、复制和粘贴图标,样式等)

感谢任何帮助

10个回答

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

1
这个很不错,因为你甚至看不出工具栏曾经在那里。 - Brad Turek

12

如果您使用不受支持的方法,您可以轻松地自定义工具栏。

正如Uluk在他的答案中所述,下面的这些方法不被官方支持。

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

7

根据官方教程,您似乎无法进行切换。

格式工具栏是在组件的实现中提供的。您无法切换其可见性。但是,您仍然可以通过应用CSS样式来自定义编辑器的外观...


7
我已经创建了一些函数来修改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;
      }       
}

6

如果有人真的想使用不支持的方法来隐藏工具栏,那么有一种更简单的方法可以实现这一点(我没有测试过这是否会在HTMLEditor控件中引起任何问题,因此请自行承担风险)。

package htmleditorsample;

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
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 primaryStage) {
        final HTMLEditor htmlEditor = new HTMLEditor();
        primaryStage.setScene(new Scene(htmlEditor));
        primaryStage.show();

        for (Node toolBar = htmlEditor.lookup(".tool-bar"); toolBar != null; toolBar = htmlEditor.lookup(".tool-bar")) {
            ((Pane) toolBar.getParent()).getChildren().remove(toolBar);
        }
    }
}

当我尝试运行您的代码(JavaFX 8)时,出现了这个NullPointerException。链接 - Brad Turek

2

试试这个:

.html-editor .top-toolbar
{
        -fx-max-width: 0px;
 -fx-min-width: 0px;
 -fx-pref-width: 0px;
 -fx-max-height: 0px;
 -fx-min-height: 0px;
 -fx-pref-height: 0px;
        -fx-opacity: 0;
}
.html-editor .bottom-toolbar
{
        -fx-max-width: 0px;
 -fx-min-width: 0px;
 -fx-pref-width: 0px;
 -fx-max-height: 0px;
 -fx-min-height: 0px;
 -fx-pref-height: 0px;
        -fx-opacity: 0;
}


1
你应该能够隐藏工具栏上的按钮,甚至删除它们。
我会这样做:

final Map map = new HashMap();
for (Node candidate: (htmlEditor.lookupAll("ToolBar"))) {
  List list = ((ToolBar) candidate).getItems();
  for (int i = 0; i < list.size(); i++) {
    Node b = (Node) list.get(i);
    map.put(map.size() + 1, b);
  }
}

// So we've fetch all buttons (including separators) and assigned
// each an index number.  Now then to hide an item:

((Node) map.get(2)).setVisible(false); // Hides copy button
((Node) map.get(13)).setVisible(false); // Hides bullets button

// Or to just completely remove them:

map.remove(18); // Removes font-menu-button
map.remove(25); // Removes editor-strike button


0
.tool-bar
{
    /*-fx-visibility:hidden;
     -fx-display:none; */

    -fx-opacity: 0;
}

透明度有效,但菜单仍然处于活动状态。


0

这是一个相当古老的线程,但是大多数答案只能在较新的JDK上部分工作,因此这里是我基于该线程中某些概念编写的自定义HTML编辑器类。

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


奇怪!!!我尝试了你的代码,但它没有删除三个组合框:"格式"、"字体"或"大小"。其中一个 ==> nodesToKeep.add(editor.lookup(".format-menu-button")); - Adalberto José Brasaca

0

您可以使用CSS删除特定的按钮,例如:

.html-editor-copy {
  visibility: hidden;
}

完整的CSS按钮名称列表可以在以下链接中找到: Oracle CSS参考指南


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接