JavaFX SwingNode中的Java 2d绘画问题

问题描述

我有一个 Java 应用程序,带有用纯 Java Swing 和 Java2D 编写的旧矢量图形编辑器。

现在我想将整个应用程序迁移到 Javafx 工具包,图形编辑器除外。图形编辑器仍然基于 Swing/Java2D,以避免将图形事件处理长时间重写为 Javafx。我知道的唯一方法是使用 JavaFX SwingNode 组件。

问题在于位于 JavaFX SwingNode 内的 Swing 组件上的鼠标绘制:鼠标事件处理良好,但没有可见的图形变化。位于 Swing JFrame 中的相同组件绘制得很好。 (请注意,绘画必须在没有完全重绘摆动组件的情况下进行)。

有谁知道在 SwingNode 中实现与在 JFrame 中相同的行为的方法吗?

下面的测试类 TestPaintOnSwingNode.java 完成工作:

package x;

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class TestPaintOnSwingNode extends Application {
    private Scene scene;
    private Stage stage;

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Swing PaintPanel on JavaFX Stage with SwingNode");
        stage.setWidth(1200);
        stage.setHeight(800);
        AnchorPane rootPane = new AnchorPane();
        scene = new Scene(rootPane);

        createPaintPaneOnFXSwingNode(rootPane);
        SwingUtilities.invokelater(()->
            createPaintPaneOnJFrame()
        );
        stage.setScene(scene);
        stage.show();
    }

    private void createPaintPaneOnJFrame() {
        JFrame frame = new JFrame();
        frame.setTitle("Swing PaintPanel on Swing JFrame");
        frame.setSize(new Dimension(1200,800));
        frame.add(new PaintPanel());
        frame.setVisible(true);

    }

    private void createPaintPaneOnFXSwingNode(AnchorPane pane) {
        SwingNode swingNode = new SwingNode();
        SwingUtilities.invokelater(() -> swingNode.setContent(
                new PaintPanel()
        ));
        pane.getChildren().add(swingNode);
        AnchorPane.setLeftAnchor(swingNode,0D);
        AnchorPane.setRightAnchor(swingNode,0D);
        AnchorPane.setTopAnchor(swingNode,0D);
        AnchorPane.setBottomAnchor(swingNode,0D);
    }
}

class PaintPanel extends JPanel implements MouseListener,MouseMotionListener {

    private int lastX = 0;
    private int lastY = 0;

    PaintPanel() {
        addMouseListener(this);
        addMouseMotionListener(this);
        setBackground(Color.ORANGE);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        lastX = e.getX();
        lastY = e.getY();
    }

    @Override
    public void mousepressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        if (lastX > 0) {
            System.out.println(e);
            Graphics2D graphics = (Graphics2D) getGraphics();
            graphics.drawLine(lastX,lastY,e.getX(),e.getY());
            lastX = e.getX();
            lastY = e.getY();
        }
    }
}

运行测试类和鼠标在组件上移动后的结果如下所示。 该测试只是绘制一条从以前的鼠标坐标到当前的线。第一次单击 PaintPanel 后开始绘画。 当鼠标在两个对话框中的每一个上移动时,事件在控制台中打印得很好。但绘制结果仅在原生 Swing 窗口中可见。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)