java awt canvas_JavaFX AWT Canvas

更新

虽然本答案中的代码曾经在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场景内).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值