< prev index next >
modules/javafx.swing/src/main/java/javafx/embed/swing/SwingFXUtils.java
Print this page
@@ -26,10 +26,13 @@
package javafx.embed.swing;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.awt.image.SampleModel;
+import java.awt.image.SinglePixelPackedSampleModel;
import java.nio.IntBuffer;
import java.util.Set;
import java.util.HashSet;
import javafx.application.Platform;
import javafx.scene.image.Image;
@@ -39,11 +42,10 @@
import javafx.scene.image.WritableImage;
import javafx.scene.image.WritablePixelFormat;
import javafx.scene.paint.Color;
import com.sun.javafx.tk.Toolkit;
import javax.swing.SwingUtilities;
-import sun.awt.image.IntegerComponentRaster;
/**
* This class provides utility methods for converting data types between
* Swing/AWT and JavaFX formats.
* @since JavaFX 2.2
@@ -109,14 +111,19 @@
}
if (wimg == null) {
wimg = new WritableImage(bw, bh);
}
PixelWriter pw = wimg.getPixelWriter();
- IntegerComponentRaster icr = (IntegerComponentRaster) bimg.getRaster();
- int data[] = icr.getDataStorage();
- int offset = icr.getDataOffset(0);
- int scan = icr.getScanlineStride();
+ DataBufferInt db = (DataBufferInt)bimg.getRaster().getDataBuffer();
+ int data[] = db.getData();
+ int offset = bimg.getRaster().getDataBuffer().getOffset();
+ int scan = 0;
+ SampleModel sm = bimg.getRaster().getSampleModel();
+ if (sm instanceof SinglePixelPackedSampleModel) {
+ scan = ((SinglePixelPackedSampleModel)sm).getScanlineStride();
+ }
+
PixelFormat<IntBuffer> pf = (bimg.isAlphaPremultiplied() ?
PixelFormat.getIntArgbPreInstance() :
PixelFormat.getIntArgbInstance());
pw.setPixels(0, 0, bw, bh, pf, data, offset, scan);
return wimg;
@@ -279,26 +286,33 @@
}
}
if (bimg == null) {
bimg = new BufferedImage(iw, ih, prefBimgType);
}
- IntegerComponentRaster icr = (IntegerComponentRaster) bimg.getRaster();
- int offset = icr.getDataOffset(0);
- int scan = icr.getScanlineStride();
- int data[] = icr.getDataStorage();
+ DataBufferInt db = (DataBufferInt)bimg.getRaster().getDataBuffer();
+ int data[] = db.getData();
+ int offset = bimg.getRaster().getDataBuffer().getOffset();
+ int scan = 0;
+ SampleModel sm = bimg.getRaster().getSampleModel();
+ if (sm instanceof SinglePixelPackedSampleModel) {
+ scan = ((SinglePixelPackedSampleModel)sm).getScanlineStride();
+ }
+
WritablePixelFormat<IntBuffer> pf = getAssociatedPixelFormat(bimg);
pr.getPixels(0, 0, iw, ih, pf, data, offset, scan);
return bimg;
}
/**
* If called from the FX Application Thread
* invokes a runnable directly blocking the calling code
* Otherwise
* uses Platform.runLater without blocking
+ *
+ * @param runnable {@code Runnable} to be invoked
*/
- static void runOnFxThread(Runnable runnable) {
+ public static void runOnFxThread(Runnable runnable) {
if (Platform.isFxApplicationThread()) {
runnable.run();
} else {
Platform.runLater(runnable);
}
@@ -307,25 +321,31 @@
/**
* If called from the event dispatch thread
* invokes a runnable directly blocking the calling code
* Otherwise
* uses SwingUtilities.invokeLater without blocking
+ *
+ * @param r {@code Runnable} to be invoked
*/
- static void runOnEDT(final Runnable r) {
+ public static void runOnEDT(final Runnable r) {
if (SwingUtilities.isEventDispatchThread()) {
r.run();
} else {
SwingUtilities.invokeLater(r);
}
}
private static final Set<Object> eventLoopKeys = new HashSet<>();
/**
- * The runnable is responsible for leaving the nested event loop.
+ * The runnable is responsible for entering the nested event loop.
+ *
+ * @param nestedLoopKey the Object that identifies the nested event loop,
+ * which must not be null
+ * @param r {@code Runnable} to be invoked
*/
- static void runOnEDTAndWait(Object nestedLoopKey, Runnable r) {
+ public static void runOnEDTAndWait(Object nestedLoopKey, Runnable r) {
Toolkit.getToolkit().checkFxUserThread();
if (SwingUtilities.isEventDispatchThread()) {
r.run();
} else {
@@ -333,11 +353,17 @@
SwingUtilities.invokeLater(r);
Toolkit.getToolkit().enterNestedEventLoop(nestedLoopKey);
}
}
- static void leaveFXNestedLoop(Object nestedLoopKey) {
+ /**
+ * The runnable is responsible for leaving the nested event loop.
+ *
+ * @param nestedLoopKey the Object that identifies the nested event loop,
+ * which must not be null
+ */
+ public static void leaveFXNestedLoop(Object nestedLoopKey) {
if (!eventLoopKeys.contains(nestedLoopKey)) return;
if (Platform.isFxApplicationThread()) {
Toolkit.getToolkit().exitNestedEventLoop(nestedLoopKey, null);
} else {
< prev index next >