问题描述
我有一个 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 (将#修改为@)