2017-10-18 6 views
1

끌어서 놓기 작업 중에 팝업 대화 상자를 사용하고 있습니다. 드롭이 발생하면 대화 상자가 팝업되고 해제 될 때 이벤트 체인이 계속되어야하며 드래그 작업이 끝날 때 어떤 일이 일어나도록 허용해야합니다. 팝업 대화 상자가 FX 인 경우 아무런 문제가 없습니다. 그러나 Gluon이라면 드래그 완료 작업이 발생하지 않습니다. 배경이 빨간색으로 변경하는에대화 상자가 끌기 완료 이벤트를 전파하지 않습니다.

import javafx.scene.control.Alert.AlertType; 
import javafx.scene.control.Label; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.DataFormat; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 

import com.gluonhq.charm.glisten.mvc.View; 

public class MainView extends View { 

    HBox root; 

    public MainView(String name) { 
     super(name); 

     Label source = new Label("Source"); 
     configureDragSource(source); 
     Label target = new Label("Target"); 
     configureDragTarget(target); 
     Label popupTarget = new Label("Popup Target"); 
     configureDragPopupTarget(popupTarget); 
     root = new HBox(40, source, target, popupTarget); 
     setCenter(root); 
    } 

    private void configureDragSource(Label source) { 
     source.setOnDragDetected(e -> { 
      root.setBackground(new Background(new BackgroundFill(Color.RED, null, null))); 
      Dragboard db = source.startDragAndDrop(TransferMode.ANY); 
      ClipboardContent content = new ClipboardContent(); 
      content.put(DataFormat.PLAIN_TEXT, source.getText()); 
      db.setContent(content); 
     }); 
     source.setOnDragDone(e -> root.setBackground(new Background(new BackgroundFill(null, null, null)))); 
    } 

    private void configureDragTarget(Label target) { 
     target.setOnDragOver(e -> e.acceptTransferModes(TransferMode.ANY)); 

    } 

    private void configureDragPopupTarget(Label popupTarget) { 
     popupTarget.setOnDragOver(e -> e.acceptTransferModes(TransferMode.ANY)); 
     popupTarget.setOnDragDropped(e -> { 
      javafx.scene.control.Alert popup1 = new javafx.scene.control.Alert(AlertType.INFORMATION); 
      com.gluonhq.charm.glisten.control.Alert popup2 = new com.gluonhq.charm.glisten.control.Alert(AlertType.INFORMATION); 
      popup1.showAndWait(); 
     }); 
    } 
} 

소스를 드래그해야합니다 여기

은 샘플 코드입니다. 드래그 작업이 완료되면 배경이 기본값으로 돌아갑니다. 일반 드롭 대상은 아무 것도하지 않고 색상 변경이 적용됩니다. 그러나 팝업 타겟을 드롭 할 때 대화 상자가 나타나고 닫히면 글자 대화 상자가 아닌 FX 대화 상자에서만 색상이 변경됩니다. popup1.showAndWait();popup2으로 변경하십시오.

이 중요한 경우이 응용 프로그램 클래스

import com.gluonhq.charm.glisten.application.MobileApplication; 

public class TestApplication extends MobileApplication { 

    @Override 
    public void init() { 
     addViewFactory(HOME_VIEW,() -> new MainView(HOME_VIEW)); 
    } 

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

이며, 이는 Gradle을 빌드 파일입니다

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'org.javafxports:jfxmobile-plugin:1.3.5' 
    } 
} 

apply plugin: 'org.javafxports.jfxmobile' 
apply plugin: 'eclipse' 

jar { 
    manifest { 
     attributes 'Main-Class': 'com.test.TestApplication' 
    } 
} 

jfxmobile { 
    downConfig { 
     version = '3.3.0' 
     plugins 'display', 'lifecycle', 'statusbar', 'storage' 
    } 
    android { 
     compileSdkVersion = 19 
//  manifest = 'src/android/AndroidManifest.xml' 
    } 
    ios { 
     infoPList = file('src/ios/Default-Info.plist') 
     forceLinkClasses = [ 
       'com.gluonhq.**.*', 
       'javax.annotations.**.*', 
       'javax.inject.**.*', 
       'javax.json.**.*', 
       'org.glassfish.json.**.*' 
     ] 
    } 
} 

eclipse { 
    classpath { 
     downloadJavadoc = true 
     downloadSources = true 
    } 
} 

repositories { 
    jcenter() 
    maven { 
     url 'http://nexus.gluonhq.com/nexus/content/repositories/releases' 
    } 
} 

mainClassName = 'com.test.TestApplication' 

dependencies { 
    compile 'com.gluonhq:charm:4.3.5' 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '4.2' 
} 

compile 'com.gluonhq:charm:4.3.7' 및 4.4.0에도 발생합니다.

Java 8 b141에서 실행 중입니다. 왜 이런 일이 생길까요? 이거 버그 야?

+0

대화 상자의 javadoc 페이지에'dialog.setContent (new Label ("그냥 일반 대화 상자, 평이하고 단순한");'''가 없습니다. – Mark

+0

데스크탑에서'popup2'를 실행할 때 NPE가 보입니까? –

+0

@ JoséPereda 아니요. 또한 이벤트 처리기 내부에서 캐치 시도를 추가했으며 아무 것도 잡히지 않았습니다. 특정 장소를보아야합니까? – Mark

답변

1

JavaFX 기본 제공 대화 상자와 Gluon 대화 상자가 동일하지 않습니다. 사실, 후자는 Layer에서 확장 된 반면 전자는 차단되어 있습니다. 맥에 게시 된 코드를 실행

, 나는, popupTarget 이상 하락 후 NPE를 얻을 사용하여 쉽게 해결 될 수 : 드래그 이벤트가 대화, 가능한 해결책에 의해 소비되는 점을 감안 또한

Platform.runLater(() -> popup2.showAndWait()); 

을 수 :

Platform.runLater(() -> 
    popup2.showAndWait() 
     .ifPresent(r -> 
      root.setBackground(new Background(new BackgroundFill(null, null, null))))); 

그래서 당신이 setOnDragDone 방법을 리팩토링 할 수 있으며, 단지 대화가 아니라 닫힌 후 호출 할 수있는 방법을 만들 수 있습니다.

대상은 드래그에서 이러한 이벤트를 수신 및 제스처 드롭 :

DRAG_OVER 
DRAG_OVER 
... // until drop is done: 
// show Dialog 
... 
// hide Dialog 
DRAG_DROPPED 
DRAG_EXITED 
DRAG_EXITED_TARGET 

편집

이 대상과 소스 모두 DND 이벤트가 시작되면받을 드래그 이벤트는

이들이 JavaFX 및 Gluon 대화 상자와 정확히 동일하게 작동합니다 (적어도 NPE 덕분에 Mac에서는 Netscape에서 Platform.runLater()을 사용하면 분명히 대화 상자가 표시되고 대화 상자 이벤트가 숨김). , 지금은 Windows에만 집중할 수 있습니다).

오른쪽 마지막 이벤트 후, 소스 수신 :

DRAG_DONE 

하지만 단지 자바 FX 대화 상자가.

Scene 클래스는 DnDGesture 개인 클래스가 있습니다 : 디버깅 후

는 이유는 왜 글루온의 대화는 다음과 같이 드래그 할 이벤트가 설명 될 수있다 중단

/** 
* A Drag and Drop gesture has a lifespan that lasts from mouse 
* PRESSED event to mouse RELEASED event. 
*/ 
class DnDGesture { 
    ... 
} 

을 그리고 설명으로 덧글에서 마우스 누름 이벤트에서 마우스 놓기 이벤트까지의 수명이 있습니다.

JavaFX 기본 제공 대화 상자를 사용하면 새 스테이지와 새로운 장면에 표시됩니다. 여기서 핵심은이 대화 상자 (및 모든 마우스 이벤트 집합)가 새로운 모달 단계에 표시되므로 대화 상자가 숨겨지면 기본 단계에서 다시 포커스를 가져와 다시 시작하여 마우스가 움직일 때 dnd 동작을 제대로 완료한다는 것입니다. 풀어 놓았다.

그러나 Gluon의 대화 상자를 사용하면 두 번째 단계가 없습니다. 모든 것이 동일한 단계에서 발생하고 마우스가 해제되면 Scene.DnDGesture이 null이되므로 DRAG_EXITED_TARGET 이벤트가 대상에서 발생하면 적절한 호출이 완료되어 dnd 프로세스가 완료되지만이 시점에서 dndGesture은 null이며 통화가 더 이상 소스에 도달하지 않습니다.

모바일 환경에서 두 번째 스테이지/장면을 피하고 View/Layer (한 단계로) 디자인을 유지해야하는 여러 가지 이유가 있으므로이 문제는 버그라고 생각하지 않습니다. .

+0

예 현재 해결 방법은 오류가 발생하지 않기 때문에 runLater없이 두 번째 예제에서 수행 한 것과 비슷한 끌어 놓기 안에 드래그 완료 이벤트 핸들러를 호출하는 것입니다. 글루온 대화 상자가 기본 대화 상자처럼 작동하지 않는 것입니까? 이것이 버그라고 생각 될까요? – Mark

+0

나는 무슨 일이 일어나고 있는지, 그리고 내가 버그라고 생각하지 않는 이유에 대한 자세한 설명으로 답을 편집했다. –