我正在使用javafx 2.0和netbean 7.1,我在ImageView上拖放图像时遇到问题,.i将图像保存为源(一个图像)和2个目标点(2个框为目标点)。当第一次尝试拖动图像时,其工作正常并且在源图像输入到目标框之后。再次尝试拖动图像,以下错误被提示" java.lang.IllegalArgumentException:错误字节缓冲区大小18x15 [1080]!= 0"
一旦图像移动到目标对象,我需要设置监听器将其更改为源,我觉得它在这个地方抛出错误..
代码使用
public class DragandDropEx extends Application {
/**
* @param args the command line arguments
*/
GridPane Board;
ImageView deactivateImageView = new ImageView();
ImageView newImageView = new ImageView();
final Rectangle target = new Rectangle(0, 0, 50, 50);
final Rectangle target2 = new Rectangle(0, 0, 50, 50);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
target.setFill(Color.CHOCOLATE);
target2.setFill(Color.BLUE);
Image image = new Image(getClass().getResourceAsStream("triangle.png"));
getDeactivateImageView().setImage(image);
Board = new GridPane();
primaryStage.setTitle("Drag and Drop");
createSource(getDeactivateImageView());
target.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent events) {
events.acceptTransferModes(TransferMode.MOVE);
events.consume();
createTargetDrop(target,0,8);
}
});
target2.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent events) {
events.acceptTransferModes(TransferMode.MOVE);
events.consume();
createTargetDrop(target2,0,9);
}
});
Board.add(getDeactivateImageView(), 0, 1);
Board.add(target, 0, 8);
Board.add(target2, 0, 9);
StackPane root = new StackPane();
root.getChildren().add(Board);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private void createSource(final ImageView imageView) {
imageView.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent events) {
Dragboard storeImage =imageView.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putImage(imageView.getImage());
storeImage.setContent(content); **// here i am getting error**
events.consume();
}
});
}
private void createTargetDrop(final Rectangle target,final int xCordination,final int yCordination) {
target.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
Dragboard db = event.getDragboard();
Image dragedImage = db.getImage();
getNewImageView().setImage(dragedImage);
getDeactivateImageView().setVisible(false);
setDeactivateImageView(getNewImageView());
Board.add(getDeactivateImageView(),xCordination,yCordination );
event.consume();
createSource(getDeactivateImageView()); // setting listener to new image
}
});
}
}
答案 0 :(得分:0)
您使用哪个JavaFX版本?
您可能遇到问题,已在2.1:http://javafx-jira.kenai.com/browse/RT-14348
中修复如果您使用的是2.0.x版本,可以试用FX 2.1的开发人员版本:http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html
答案 1 :(得分:0)
我想它的参考资料。我的意思是你对不同的地方使用相同的参考。也许你应该使用对象的克隆。我没有深入研究代码,但看起来你正试图将相同的对象添加到不同的地方。
答案 2 :(得分:0)
我建议使用JavaFX,因为它包含用于创建GUI的scenebuilder(GUI)。您可以拖放GUI元素并在画布上调整它们的大小。然后,这将创建一个连接到Java控制文件的FXML文件。
在这里查看scenebuilder:http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-info-2157684.html
将FXML连接到Java代码有一点学习曲线,但如果您想以图形方式设计GUI,这是值得的。