2017-02-27 13 views
0

JavaFXでhello Worldアプリケーションを作成しましたが、QuitHandlerとAboutHandlerの両方を使用しています。 'About'と 'Preferences'メニューアイテムメニューに表示されていません。JavaFX: 'About' OSXの 'Application Menu'からMenuItemが見つかりません

enter image description here

どのように私はそれはのように見えるようにすることができます

enter image description here

また、QuitHandlerはタラがあり、ここで、行動保存チェックを実行していませんeをjavaFX Hello Worldに追加しました。

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

私はこのコードが間違っているかを知りたいですか?

編集1:このコードをコンパイルしてテストするためのpom.xml。

<?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

あなたがこれを実行しているアプリケーションのOSをテストする必要はありませんcom.apple。*クラスは他のプラットフォームで利用できなくなりますあなたのアプリはClassDefNotFound例外で失敗します。 –

+0

@ user1993392私はpom.xmlをコンパイルとテスト(編集1を参照)に追加しました。自由にテストしてください。 – josephino

答えて

関連する問題