2015-09-20 5 views
0

Я создаю программное обеспечение с использованием JavaFX с контекстным меню, в которое я хочу применить css. По-видимому, css не отображается. Я хотел бы знать, почему это не работает, и я хотел бы знать, если это ошибка в api или ошибка, сделанная мной.Контекстное меню JavaFX Css не работает

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

+0

Помещенный здесь только код, который требуется, чтобы понять вашу проблему. –

ответ

0

Стиль класса context-menu не имеет непосредственный ребенок по имени menu-item. см. this link.

Вы должны использовать селектор потомков. Селектор потомков состоит из двух или более селекторов, разделенных пробелами. Термин «потомок» означает ребенка на любом уровне (прямое или нет).

Попробуйте использовать следующие стили:

#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: следующий код отлично работает для меня:

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

    } 

} 
+0

Видимо, стиль не меняется. – frogocomics

+0

не забудьте сделать это: 'scene.getStylesheets(). Add (" packageName/fileName.css ");' или вы можете использовать другой способ: 'String contextMenustyle = getClass(). GetResource (" fileName.css ") .toExternalForm(); scene.getStylesheets(). Add (contextMenustyle); ' – Kachna

+0

Win.ubuntu Спасибо, но я уже сделал это в начале. Теперь я начинаю думать, что это ошибка библиотеки JavaFX. – frogocomics

Смежные вопросы