简体   繁体   English

JavaFX CSS上下文菜单不起作用

[英]JavaFX Css Context Menu not working

I am creating a software using JavaFX with a context menu that I want to apply css to. 我正在使用JavaFX创建一个我要应用CSS的上下文菜单的软件。 Apparently the css is not showing. 显然,CSS没有显示。 I would like to know why this is not working and I would like to know if it is a error in the api or an error made by me. 我想知道为什么这是行不通的,我想知道这是api中的错误还是我的错误。

/*
 * BlockEdit, a general purpose software to edit Minecraft
 * Copyright (c) 2015. Jeff Chen and others
 *
 * This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program. If not, see <http://www.gnu.org/licenses/>
 */

package org.blockedit.utils;

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.io.File;
import java.io.PrintStream;
import java.util.Optional;

import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.TextArea;

public class MiniConsole {

    private TextArea area;
    private ConsoleOutputStream output;
    private PrintStream printStream;
    private ContextMenu rightClick;

    public void start() {
        this.area = new TextArea();
        this.area.setWrapText(true);
        this.area.setEditable(false);
        this.area.setPrefColumnCount(150);
        this.output = new ConsoleOutputStream(this.area);
        this.printStream = new PrintStream(this.output, true);
        System.setOut(this.printStream);
        System.setErr(this.printStream);

        this.rightClick = new ContextMenu();
        this.rightClick.setId("debugMenu");
        MenuItem copyItem = new MenuItem("Copy");
        copyItem.setOnAction(event -> {
            if (this.area.getSelectedText().isEmpty()) {
                event.consume();
            } else {
                StringSelection selection = new StringSelection(this.area.getSelectedText());
                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection);
            }
        });
        MenuItem selectAllItem = new MenuItem("Select All");
        selectAllItem.setOnAction(event -> {
            this.area.selectAll();
        });
        MenuItem deselectItem = new MenuItem("Deselect");
        deselectItem.setOnAction(event -> {
            this.area.deselect();
        });
        this.rightClick.getItems().addAll(copyItem, new SeparatorMenuItem(), selectAllItem, deselectItem);
        this.area.setContextMenu(this.rightClick);
        this.area.getStylesheets().add("https://fonts.googleapis.com/css?family=Open+Sans:400,700,800italic,800,700italic,600,600italic,300,300italic&subset=latin,greek-ext,greek,cyrillic,vietnamese,cyrillic-ext,latin-ext");
        this.area.getStylesheets().add("file:///" + new File("src/main/resources/miniconsole.css").getAbsolutePath().replace("\\", "/"));
    }

    public Optional<TextArea> getConsole() {
        if (this.area == null) {
            return Optional.empty();
        }
        return Optional.of(this.area);
    }

    public Optional<ConsoleOutputStream> getConsoleOutputStream() {
        if (this.output == null) {
            return Optional.empty();
        }
        return Optional.of(this.output);
    }

    public Optional<PrintStream> getPrintStream() {
        if (this.printStream == null) {
            return Optional.empty();
        }
        return Optional.of(this.printStream);
    }
}

/*
 * BlockEdit, a general purpose software to edit Minecraft
 * Copyright (c) 2015. Jeff Chen and others
 *
 * This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program. If not, see <http://www.gnu.org/licenses/>
 */

#debugMenu > .menu-item {
    -fx-font-family: "Open Sans", "Garmond", sans-serif;
}

#debugMenu > .menu-item:focused {
    -fx-font-weight: bold;
    -fx-background-color: #21ABCD;
    -fx-effect: innershadow( gaussian , rgba(0,0,0,0.2) , 10,0,0,0 );
}

the Style class context-menu doesn't have an immediate child named menu-item . Style类的context-menu没有名为menu-item的直接子menu-item see this link . 看到这个链接

You should use descendant selector. 您应该使用后代选择器。 A descendant selector consists of two or more selectors separated by whitespaces. 后代选择器由两个或多个由空格分隔的选择器组成。 The term descendant means a child at any level (direct or not). 后代一词是指任何级别的孩子(直接或间接)。

Try to use the following styles: 尝试使用以下样式:

#debugMenu .menu-item  {
    -fx-font-family: "Open Sans", "Garmond", sans-serif;
}

#debugMenu  .menu-item:focused   {
    -fx-font-weight: bold;
    -fx-background-color: red;
    -fx-effect: innershadow( gaussian , rgba(0,0,0,0.2) , 10,0,0,0 );
}

Update: the following code works fine for me: 更新:以下代码对我来说很好:

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

/**
 *
 * @author 
 */
public class Main extends Application {

    private TextArea area;

    private ContextMenu rightClick;

    @Override
    public void start(Stage stage) {
        this.area = new TextArea();
        this.area.setWrapText(true);
        this.area.setEditable(false);
        this.area.setPrefColumnCount(150);
        this.rightClick = new ContextMenu();
        this.rightClick.setId("debugMenu");
        MenuItem copyItem = new MenuItem("Copy");
        copyItem.setOnAction(event -> {
            if (this.area.getSelectedText().isEmpty()) {
                event.consume();
            } else {
                StringSelection selection = new StringSelection(this.area.getSelectedText());
                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection);
            }
        });
        MenuItem selectAllItem = new MenuItem("Select All");
        selectAllItem.setOnAction(event -> {
            this.area.selectAll();
        });
        MenuItem deselectItem = new MenuItem("Deselect");
        deselectItem.setOnAction(event -> {
            this.area.deselect();
        });
        this.rightClick.getItems().addAll(copyItem, new SeparatorMenuItem(), selectAllItem, deselectItem);
        this.area.setContextMenu(this.rightClick);
        MenuBar menuBar = new MenuBar();
        Menu file = new Menu("File");
        Menu options = new Menu("Options");
        menuBar.getMenus().addAll(file, options);
        MenuItem newProject = new MenuItem("New");
        MenuItem save = new MenuItem("Save");
        MenuItem delete = new MenuItem("Delete");
        MenuItem quit = new MenuItem("Exit");
        MenuItem option1 = new MenuItem("Option1");
        BorderPane root = new BorderPane();
        file.getItems().addAll(newProject, save, delete, new SeparatorMenuItem(), quit);
        options.getItems().add(option1);
        root.setTop(menuBar);
        root.setCenter(area);
        Scene scene = new Scene(root, 400, 300);
        String contextMenustyle = getClass().getResource("menu-Style.css").toExternalForm();
        scene.getStylesheets().add(contextMenustyle);
        stage.setScene(scene);
        stage.show();

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM