import com.sun.glass.ui.Robot; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.lang.Thread.UncaughtExceptionHandler; import java.util.concurrent.Semaphore; import javafx.application.Application; import javafx.embed.swing.SwingNode; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; /** * * @author aeremeev */ public class SwingNodeContentSizeTest extends Application { private JComponent[] components = new JComponent[]{ new JButton("Button"), new JCheckBox("CheckBox"), new JLabel("Label"), new JTextField("TextField"), new JTextArea("TextArea") }; private Semaphore semaphore = new Semaphore(1); private final Robot robot = createRobot(); private SwingNode swingNode; private Pane pane; @Override public void start(final Stage stage) throws Exception { Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.err.println("Uncaught exception on thread : " + t); e.printStackTrace(); //System.exit(1); } }); stage.setOnShown(new EventHandler() { @Override public void handle(WindowEvent t) { new Thread(new Runnable() { @Override public void run() { try { int failCount = 0; for (JComponent c : components) { invokeAndWait(new Runnable() { @Override public void run() { stage.setX(50); stage.setY(50); pane = new StackPane(); Scene scene = new Scene(pane, 200, 200); stage.setScene(scene); swingNode = new SwingNode(); pane.getChildren().add(swingNode); } }); init(swingNode, c); semaphore.acquire(); delay(100); final int x = (int) stage.getX(); final int y = (int) stage.getY(); final int width = (int) stage.getWidth(); final int height = (int) stage.getHeight(); invokeAndWait(new Runnable() { @Override public void run() { robot.mouseMove(x + width - 2, y + height - 2); } }); for (int i = 1; i <= 10; ++i) { final int index = i; invokeAndWait(new Runnable() { @Override public void run() { robot.mousePress(MouseEvent.BUTTON1); robot.mouseMove(x + width - 2 + 5 * index, y + height - 2 + 5 * index); robot.mouseRelease(MouseEvent.BUTTON1); } }); delay(250); Dimension size = c.getSize(); int paneWidth = (int) pane.getWidth(); int paneHeight = (int) pane.getHeight(); if (size.width != paneWidth || size.height != paneHeight) { System.err.println("Size of pane does not equal to the size of component : " + c); System.err.printf("JComponent : width=%d, height=%d", size.width, size.height); System.err.printf("Pane : width=%d, height=%d", paneWidth, paneHeight); ++failCount; } } invokeAndWait(new Runnable() { public void run() { robot.mouseMove(x + width / 2, y + 10); } }); for (int i = 1; i <= 10; ++i) { final int index = i; invokeAndWait(new Runnable() { @Override public void run() { robot.mousePress(MouseEvent.BUTTON1); robot.mouseMove(x + width / 2 + 5 * index, y + 10); robot.mouseRelease(MouseEvent.BUTTON1); } }); delay(250); Dimension size = c.getSize(); int paneWidth = (int) pane.getWidth(); int paneHeight = (int) pane.getHeight(); if (size.width != paneWidth || size.height != paneHeight) { System.err.println("Size of pane does not equal to the size of component : " + c); System.err.printf("JComponent : width=%d, height=%d", size.width, size.height); System.err.printf("Pane : width=%d, height=%d", paneWidth, paneHeight); ++failCount; } } } if (failCount > 0) { //System.exit(0); } else { //System.exit(1); } } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }).start(); } }); stage.show(); } private void init(final SwingNode swingNode, final JComponent component) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { swingNode.setContent(component); semaphore.release(); } }); } private Robot createRobot() { return com.sun.glass.ui.Application.GetApplication().createRobot(); } private void invokeAndWait(Runnable run) { com.sun.glass.ui.Application.invokeAndWait(run); } private void delay(int time) throws InterruptedException { Thread.sleep(time); } public static void main(String[] args) { launch(args); } }