3

ドラッグ アンド ドロップでクリップボードにカスタム データを受信させようとしています。カスタム データは別の Java タイプです。この他のタイプはシリアライズ可能を実装しているため、これが機能しない理由はよくわかりません。どんなアイデアでも大歓迎です!

imgView.setOnDragDetected(new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
        ClipboardContent content = new ClipboardContent();
        content.put(dataFormat, RHSIconizedToken.this);
        Dragboard db = imgView.startDragAndDrop(TransferMode.ANY); 
        db.setContent(content); 
        event.consume();
    }
});

後でこのオブジェクトを取得するには、次を使用しています。

RHSIconizedToken replacementRHSiToken = (RHSIconizedToken) db.getContent(RHSIconizedToken.getDataFormat());

次のエラーが表示されますが、RHSIconizedToken は Serializable を実装しています

java.lang.IllegalArgumentException: データをシリアライズできませんでした

GetDataFormat は、最初のコード例の put 引数で使用される DataFormat オブジェクトを返します。

4

2 に答える 2

1

ドラッグ オブジェクトがシリアル化できない場合は、ドラッグ中にグローバル変数に保存します。同じ JVM 内のペイン間を移動するドラッグ可能なタブを使用した JavaFx (ラムダを使用した Java8) の例を次に示します。

import java.util.Random;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;  

public class DraggingTabPane extends Application {  

    private static final DataFormat TAB_TYPE = new DataFormat("nonserializableObject/tab");
    private static Tab dndTab;// global for drag-n-drop of non-serializable type

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

    @Override  
    public void start(Stage primaryStage) {  
        TabPane tabPane1 = createDndTabPane();  
        TabPane tabPane2 = createDndTabPane();  
        VBox root = new VBox(10);  
        root.getChildren().addAll(tabPane1, tabPane2);  

        final Random rng = new Random();  
        for (int i=1; i<=8; i++) {  
            final Tab tab = createDraggableTab("Tab "+i);  
            final StackPane pane = new StackPane();  
            int red = rng.nextInt(256);  
            int green = rng.nextInt(256);  
            int blue = rng.nextInt(256);  
            String style = String.format("-fx-background-color: rgb(%d, %d, %d);", red, green, blue);  
            pane.setStyle(style);  
            final Label label = new Label("This is tab "+i);  
            label.setStyle(String.format("-fx-text-fill: rgb(%d, %d, %d);", 256-red, 256-green, 256-blue));  
            pane.getChildren().add(label);  
            pane.setMinWidth(600);  
            pane.setMinHeight(250);  
            tab.setContent(pane);  
            if (i<=4) {  
                tabPane1.getTabs().add(tab);  
            } else {  
                tabPane2.getTabs().add(tab);  
            }  
        }  

        primaryStage.setScene(new Scene(root, 600, 600));  
        primaryStage.show();  
    }  

    public TabPane createDndTabPane() {  
        final TabPane tabPane = new TabPane();  
        tabPane.setOnDragOver(event -> {  
            if (event.getDragboard().hasContent(TAB_TYPE) 
                    && dndTab.getTabPane() != tabPane) {// && different from source location  
                event.acceptTransferModes(TransferMode.MOVE);
                event.consume();  
            }  
        });  
        tabPane.setOnDragDropped(event -> {  
            if (event.getDragboard().hasContent(TAB_TYPE) 
                    && dndTab.getTabPane() != tabPane) {// && different from source location  
                dndTab.getTabPane().getTabs().remove(dndTab);  
                tabPane.getTabs().add(dndTab);  
                event.setDropCompleted(true);  
                event.consume();  
            }  
        });  
        return tabPane;  
    }  

    private Tab createDraggableTab(String text) {  
        final Tab tab = new Tab();  
        final Label label = new Label(text);  
        tab.setGraphic(label);  
        label.setOnDragDetected(event -> {  
            Dragboard dragboard = label.startDragAndDrop(TransferMode.MOVE);  
            ClipboardContent clipboardContent = new ClipboardContent();  
            clipboardContent.put(TAB_TYPE, 1);
            dndTab = tab;
            dragboard.setContent(clipboardContent);
            event.consume();
        });  
        return tab ;  
    }  
}
于 2016-05-12T21:59:54.353 に答える
1

これは、オブジェクトがシリアル化できないためです。

実際、Serializableシリアライズ可能であることを実装しているからではありません。

例外の詳細を調べると、次のようなものが見つかる場合があります

Caused by: java.io.NotSerializableException: javafx.beans.property.SimpleObjectProperty

いくつかのフィールドtransientを作成すると役立つ場合があります。

于 2013-10-15T20:12:36.090 に答える