2017-02-27 4 views
0

Ich habe eine Hallo Welt Anwendung in JavaFX erstellt und ich werde sowohl QuitHandler und AboutHandler verwenden, habe ich bemerkt, dass 'Über' und 'Einstellungen' Menü die Artikel werden nicht im Menü angezeigt:JavaFX: 'Über' MenuItem fehlt im Anwendungsmenü in OSX

enter image description here

Wie kann ich es machen wie folgt aussehen:

enter image description here

auch ist QuitHandler nicht das Kontroll speichern Verhalten ausführt, hier ist der Kabeljau e der javaFX Hallo Welt.

package helloworld; 

import com.apple.eawt.AppEvent; 
import com.apple.eawt.QuitResponse; 

import java.security.AccessControlException; 
import java.util.Optional; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Scene; 
import javafx.scene.control.Alert; 
import javafx.scene.control.ButtonType; 
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; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

/** 
* Sample application. 
* @author me 
*/ 
public class HelloWorldApplication extends Application { 
// constants -------------------------------------------------------------------------------- 
    private static final Logger LOG = LogManager.getLogger(); 

    /** 
    * Running on Mac platform. 
    */ 
    public static final boolean MAC; 

    static { 
     boolean mac = false; 
     try { 
     final String osName = System.getProperty("os.name"); 
     LOG.debug("OS: {}", osName); 
     mac = osName != null && osName.toLowerCase().contains("mac"); 
     } catch (AccessControlException ex) { 
     LOG.debug("Cannot determine OS"); 
     } 
     MAC = mac; 
    } 

// member variables ------------------------------------------------------------------------- 
    private final Alert mAlert = new Alert(Alert.AlertType.CONFIRMATION); 

// methods ---------------------------------------------------------------------------------- 
    @Override 
    public void start(Stage pStage) { 
     final BorderPane root = new BorderPane(); 

     final MenuBar menuBar = new MenuBar(); 

     final Menu fileMenu = new Menu("_File"); 
     menuBar.getMenus().add(fileMenu); 

     // Exit 
     boolean macQuitMenuItem = false; 
     if (MAC) { 
     final com.apple.eawt.Application application = com.apple.eawt.Application.getApplication(); 
     try { 
      application.setQuitHandler(
       (AppEvent.QuitEvent pEvt, QuitResponse pQuitResponse) -> Platform.runLater(
       () -> exit(pQuitResponse::cancelQuit) 
       ) 
      ); 
      macQuitMenuItem = true; 

      // occurs when running as untrusted applet 
     } catch (AccessControlException ex) { 
      LOG.debug("Cannot listen for application quit"); 
     } 
     } 
     if (!macQuitMenuItem) { 
     fileMenu.getItems().add(new SeparatorMenuItem()); 

     final MenuItem exitMenuItem = new MenuItem("E_xit"); 

     exitMenuItem.setOnAction(pEvt -> exit(() -> {})); 
     fileMenu.getItems().add(exitMenuItem); 
     } 


     root.setTop(menuBar); 
     root.setCenter(new TextArea("Hello, world!")); 

     final Scene scene = new Scene(root, 300, 250); 

     pStage.setTitle("Hello World!"); 
     pStage.setScene(scene); 

     mAlert.initOwner(pStage); 
     mAlert.setTitle("Confirm Exit"); 
     mAlert.setHeaderText("Look, a Confirmation Dialog"); 
     mAlert.setContentText("Are you sure you want to exit?"); 

     pStage.show(); 
    } 

    public static void main(String[] pArgs) {launch(pArgs);} 

    public void exit() {exit(() -> {});} 

    public void exit(Runnable pAbortExitRunnable) { 
     LOG.info("Exit"); 
     if (checkUnsavedChanges()) { 
     Platform.exit(); 
     } else { 
     pAbortExitRunnable.run(); 
     } 
    } 

    private boolean checkUnsavedChanges() { 
     final Optional<ButtonType> result = mAlert.showAndWait(); 
     return result.isPresent() && result.get() == ButtonType.OK; 
    } 
} 

Ich möchte wissen, was mit diesem Code falsch ist?

Edit 1: pom.xml, um diesen Code zu kompilieren und zu testen.

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>app</groupId> 
    <artifactId>helloworld</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>com.yuvimasory</groupId> 
      <artifactId>orange-extensions</artifactId> 
      <version>1.3.0</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-api</artifactId> 
      <version>2.8</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-core</artifactId> 
      <version>2.8</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>3.0.0</version> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>initialize</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>3.0.2</version> 
       <configuration> 
        <archive> 
         <index>true</index> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <mainClass>helloworld.HelloWorldApplication</mainClass> 
         </manifest> 
        </archive> 

       </configuration> 

      </plugin> 
     </plugins> 
    </build> 
</project> 
+1

zu werfen. Neben Ihrer Frage: Es gibt keine Notwendigkeit, das Betriebssystem der App zu testen, auf der Sie dies ausführen, die com.apple. * Klassen werden auf keiner anderen Plattform verfügbar sein und Ihre App wird mit einer ClassDefNotFound-Ausnahme fehlschlagen. –

+0

@ user1993392 Ich habe meine pom.xml hinzugefügt, um sie zu kompilieren und zu testen (siehe Edit 1), zögern Sie nicht, es erneut zu testen. – josephino

Antwort

Verwandte Themen