更新
虽然本答案中的代码曾经在Windows上使用早期版本的JavaFX,但我在OS X 10.9.5 JavaFX 8u72上重新测试了相同的代码,代码不再有效.
行swingNode.setContent(awtInitializerTask.get());它指示JavaFX线程在awt线程上等待初始化awt canvas永远不会返回,阻止应用程序的执行和启动.
只需将您的AWT画布放入SwingNode并观察您的线程管理,您就可以了.
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javax.swing.*;
import java.awt.*;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class AwtCanvasWrapper extends Application {
private static final int W = 200;
private static final int H = 100;
@Override public void start(final Stage stage) throws Exception {
final AwtInitializerTask awtInitializerTask = new AwtInitializerTask(() -> {
JPanel jPanel = new JPanel();
jPanel.add(new CustomAwtCanvas(W, H));
return jPanel;
});
SwingUtilities.invokeLater(awtInitializerTask);
SwingNode swingNode = new SwingNode();
swingNode.setContent(awtInitializerTask.get());
stage.setScene(new Scene(new Group(swingNode), W, H));
stage.setResizable(false);
stage.show();
}
private class AwtInitializerTask extends FutureTask {
public AwtInitializerTask(Callable callable) {
super(callable);
}
}
private class CustomAwtCanvas extends Canvas {
public CustomAwtCanvas(int width, int height) {
setSize(width, height);
}
public void paint(Graphics g) {
Graphics2D g2;
g2 = (Graphics2D) g;
g2.setColor(Color.GRAY);
g2.fillRect(
0, 0,
(int) getSize().getWidth(), (int) getSize().getHeight()
);
g2.setColor(Color.BLACK);
g2.drawString("It is a custom canvas area", 25, 50);
}
}
public static void main(String[] args) {
Application.launch(args);
}
}
这是输出:
相关问题
回答一些其他问题
But that one is for swing components.
是的,但是awt组件可以包装在Swing组件中.
furthermore It says in the docs that it should not be used of heavyweight components
无论如何,它似乎对我有用,你的里程可能会有所不同.
performance is crucial for my app
然后尝试使用您的应用程序并检查:
>这幅画很可靠.
>表现可以接受.
如果上述任一检查失败,那么您可能需要使用不同的方法(虽然我不知道这种方法是什么,也许只是将Frame作为一个新窗口生成,其中包含AWT画布内容而不是嵌入画布在JavaFX场景内).