2015-02-03 8 views
0

응용 프로그램에서 Accelerator를 사용하고 F1 키를 누르면 대화 상자가 한 번 열리지만 대화 상자를 닫으면 다시 나타납니다. 실행 파일이 두 번 호출되었습니다.JavaFX Accelerator가 두 번 실행됩니다.

그 사람이 무엇인지 알 수 있습니까? 그게 버그 야? 나는 맥북을 사용하여 개발 중이다.

public class Screen1Controller { 

    @FXML 
    private TextField txtCode; 

    @FXML 
    private TableView tblProducts; 

    @FXML 
    private Button buttonAskUserDecision; 

    @FXML 
    public void initialize() { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       initializeKeyCombinations(); 
      } 
     }); 
    } 

    @FXML 
    private void executePrint (ActionEvent event) { 
     System.out.println("ExecutePrint"); 
    } 

    public void initializeKeyCombinations() { 
     buttonAskUserDecision.getScene().getAccelerators().clear(); 

     buttonAskUserDecision.getScene().getAccelerators().put(
      new KeyCodeCombination(KeyCode.F1), 
      new Runnable() { 
       @Override 
       public void run() { 
        System.out.println("Executed F1"); 
       } 
      } 
     ); 
    } 
} 

이 내 FXML이다 : 나는 텍스트 필드하는있는 tableview와 버튼이있는 도구 모음이이 화면 내부

<StackPane prefHeight="600.0" prefWidth="800.0" stylesheets="@../../../css/main.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Screen1Controller"> 
<children> 
    <BorderPane prefHeight="200.0" prefWidth="200.0"> 
     <center> 
      <ScrollPane fitToHeight="true" fitToWidth="true" BorderPane.alignment="CENTER"> 
       <content> 
        <VBox alignment="TOP_CENTER"> 
         <children> 

          <GridPane hgap="10.0"> 
           <columnConstraints> 
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" /> 
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" /> 
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" /> 
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" /> 
           </columnConstraints> 
           <rowConstraints> 
            <RowConstraints fillHeight="false" minHeight="30.0" vgrow="NEVER" /> 
           </rowConstraints> 
           <children> 
            <TextField fx:id="txtCode" GridPane.columnSpan="2" /> 
           </children> 
           <VBox.margin> 
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
           </VBox.margin> 
          </GridPane> 
          <TableView fx:id="tblProducts" prefHeight="200.0" prefWidth="200.0"> 
           <columns> 
            <TableColumn prefWidth="75.0" text="C1" /> 
            <TableColumn prefWidth="75.0" text="C2" /> 
           </columns> 
          </TableView> 
         </children> 
        </VBox> 
       </content> 
      </ScrollPane> 
     </center> 
     <bottom> 
      <ToolBar maxHeight="80.0" minHeight="80.0" prefHeight="80.0" styleClass="default-skin-pdv-toolbar" stylesheets="@../../../css/main.css"> 
       <items> 
        <Button fx:id="buttonAskUserDecision" layoutX="10.0" layoutY="20.0" mnemonicParsing="false" onAction="#executePrint" prefHeight="60.0" prefWidth="69.0" styleClass="default-skin-pdv-button"> 
        </Button> 

       </items> 
       <padding> 
        <Insets left="10.0" /> 
       </padding> 
      </ToolBar> 
     </bottom> 
    </BorderPane> 
</children> 

내 컨트롤러입니다.

몇 가지 새로운 테스트를 수행했습니다. 내 tableview에 중점을두고 F1 버튼을 누를 때마다 실행이 1 씩 증가합니다. 예를 들어, tableview를 클릭하고 F1을 누르면 콘솔에서 "Executed F1"이 한 번만 인쇄되고 포커스는 되돌아갑니다 텍스트 필드에 다시 tableview에 포커스를두고 F1 키를 누르면 콘솔에 텍스트를 두 번 인쇄하고 포커스를 다시 텍스트 필드에주고 테이블 뷰에 세 번째로 포커스를두고 F1 키를 다시 누르면 그것은 콘솔에 세 줄을 더 인쇄합니다.

F1 버튼을 사용할 때만 발생합니다. 마우스로 버튼을 클릭하면 한 번만 인쇄됩니다.

화면에서 TableView를 제거하고 실행을 복제하지 않았습니다.

문제는 다음과 같습니다. 내 화면에이 tableView가 필요합니다. 여기서 무슨 일이 일어날 수 있니? 내 Java 버전의 세부 사항을의

:

java version "1.8.0_25" 
Java(TM) SE Runtime Environment (build 1.8.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 
+0

예제 코드를 게시 할 수 있다면 ... – eckig

+0

이제 애플리케이션에서 코드를 추가했습니다. – henriqueor

+0

언제/어디에서 코드를 호출할까요? 어떤 Java 버전을 사용하고 있습니까? MCVE 작성을 고려해보십시오. http://stackoverflow.com/help/mcve – eckig

답변

0

문제는 ControlsFX 라이브러리에서 구성 요소 (대화)에 있었다.

나는 새 프로젝트를 만들고 텍스트 필드, viewTable 및 버튼을 포함했습니다. 복제가 발생하지 않았습니다.

ControlsFX 대화 상자를 포함 시켰을 때 시작되었습니다. 마우스로 버튼을 클릭하면 대화 상자가 한 번 열립니다. 그러나 액셀러레이터를 사용하여 단추를 누르면 대화 상자가 두 번 열립니다.

편집 : 직접 대화 상자를 만들었지 만 다시 발생했습니다. stage.showAndWait()을 사용하는 대신 stage.show()을 시도하고 두 번 열었습니다. stackoverflow를 검색하여이 대답을 찾았습니다. https://stackoverflow.com/a/22463857/916804 ... Platform.runLater이있는 대화 상자로 전화를 걸었을 때 실행이 한 번만 발생했습니다.