我有一个遗留的swing应用程序,我需要在其中添加触摸手势,特别是要缩放、触摸和拖动。
我尝试了JDK8的SwingNode,我可以在那里运行swing应用程序,但显示性能降低了50%以上,这将不起作用。MT4J中的SwingTextureRenderer也有同样的问题,那就是甚至没有尝试将触摸事件作为鼠标事件重新分派。
我想到了一种玻璃面板方法,在顶部使用JavaFX层,捕获触摸事件,并尝试将它们作为鼠标事件分派给底层的Swing应用程序。
有没有人有别的办法?目标平台是Windows8。
一旦Stackoverflow打开它,赏金就会到来。我很快就需要这个了。
编辑:
下面是我在SwingNode上尝试的方法(鼠标重调度不起作用)。SwingNode的东西可能会分散你对最佳解决方案的注意力,所以如果你有更好的办法接触到swing,就忽略这一点:
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
StackPane pane = new StackPane();
pane.getChildren().add(swingNode);
stage.setScene(new Scene(pane, 640, 480));
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
UILib.setPlatformLookAndFeel();
// create GraphViewTouch
String datafile = null;
String label = "label";
final JPanel frame = GraphView.demoFrameless(datafile, label);
swingNode.setContent(frame);
swingNode.setOnZoom(new EventHandler<ZoomEvent>() {
@Override public void handle(ZoomEvent event) {
MouseWheelEvent me = new MouseWheelEvent(frame, 1, System.currentTimeMillis(), 0, (int)Math.round(event.getSceneX()), (int)Math.round(event.getSceneY()), (int)Math.round(event.getScreenX()), (int)Math.round(event.getScreenY()), (int)Math.round(event.getZoomFactor()), false, MouseWheelEvent.WHEEL_UNIT_SCROLL, (int)Math.round(event.getZoomFactor()), (int)Math.round(event.getZoomFactor()), event.getZoomFactor());
frame.dispatchEvent(me);
System.out.println("GraphView: Zoom event" +
", inertia: " + event.isInertia() +
", direct: " + event.isDirect());
event.consume();
}
});
}
});
}发布于 2018-11-29 13:49:22
您可以使用JNA来解析来自Windows的消息。
来自微软的多点触摸事件的一些文档:https://docs.microsoft.com/en-us/windows/desktop/wintouch/wm-touchdown
关于如何用Java实现这一点的一些文档和示例代码:https://github.com/fmsbeekmans/jest/wiki/Native-Multitouch-for-AWT-component-(Windows)
发布于 2014-02-15 19:24:31
嗯..。这是一个艰难的问题,但还是有机会的。
我要做的是创建多个MouseListener类(相对于你想要拾取的鼠标事件的数量),然后创建某种类型的系统来检测某些调整,例如。(缩放)
第一个监听器:
public void mousePressed(MouseEvent e){
//Set click to true
clk = true;
//set first mouse position
firstPos = window.getMousePosition();
}
public void mouseReleased(MouseEvent e){
//set second mouse position
secondPos = window.getMousePosition();
}第二个监听器
public void mousePressed(MouseEvent e){
//set clicked to true
clk = true;
//set first mouse position (listener 2)
firstPos = window.getMousePosition();
}
public void mouseReleased(MouseEvent e){
//set second mouse position
secondPos = window.getMousePosition();
}主处理程序
if(Listener1.get1stMousePos() < Listener1.get2ndMousePos() && Listener2.get1stMousePos() < Listener2.get2ndMousePos() && Listener1.clk && Listener2.clk){
zoomMethod((Listener1.get1stMousePos - Listener1.get2ndMousePos()) + (Listener1.get1stListener2.get2ndMousePos());
}这样做就可以将其添加到窗口:
window.addMouseListener(Listener1);
window.addMouseListener(Listener2);希望你能找到方法。
发布于 2017-10-25 05:36:49
对于收缩到缩放:
试试guigarage.com的GestureMagnificationListener吧。它提供了一种方法:
public void magnify(GestureMagnificationEvent me){...}https://stackoverflow.com/questions/21594449
复制相似问题