2013-05-02 33 views
3

我試圖讓我的剪貼板在拖放中接收一些自定義數據。自定義數據是另一種Java類型。這種其他類型不會實現可序列化,所以我真的不知道爲什麼這不起作用。任何想法表示讚賞!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 re打開第一個代碼示例中put參數中使用的DataFormat對象。

回答

1

這是因爲你的對象不可序列化。

確實,這不是因爲它實現了Serializable它是可序列化的。

異常裏面看的更深一些,你會發現這樣的事情

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

可能使某些領域transient會有所幫助。

1

如果您的拖動對象不可序列化,請在拖動過程中將其保存在全局變量中。這是一個JavaFx(帶lambda表達式的Java8)示例,帶有可拖動標籤,位於相同JVM中的窗格之前。

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