Java和Processing 3.0“框架”类已弃用,有替代方案吗?

时间:2016-08-23 17:49:53

标签: java processing frame

所以Processing曾经有一个"框架"允许一些多功能的类。我试图在屏幕上获取PApplet窗口的位置,但没有"框架"上课,我似乎无法做到。

旧方式:

int fX = frame.getX();
or
int fX = frame.getLocationOnScreen().x;

整个事情应该是动态的,因此在Processings setup()中设置窗口位置不是一种选择。

希望有人能提供帮助,

问候! 乙

2 个答案:

答案 0 :(得分:1)

您最好只使用旧的frame变量。

对于大多数此类内容,您应该使用surface类型的新PSurface变量。您可以查看PSurface here的来源。仔细阅读,我们发现surface变量不允许我们访问框架的位置。

由于您无法从surface变量到达该位置,因此您必须更深入并获得原生组件(在默认情况下,为{ {1}}扩展了一个awt SmoothCanvas)。我通过查看Canvas可用here的源代码来解决这个问题。

这个代码看起来有点粗,因为你必须做一些演员:

PSurfaceAWT

答案 1 :(得分:0)

除了凯文(Kevin)的出色答案之外,还有一个函数将其与P2DP3DFX2D渲染器的等效项一起使用:

void setup(){
  size(300,300,FX2D);
}
void draw(){
  background(0);
  text(getLocationOnScreen().toString(),10,15);
}

PVector getLocationOnScreen(){
  PVector location = new PVector();
  // JAVA2D
  if(surface instanceof processing.awt.PSurfaceAWT){
    java.awt.Frame frame = ( (processing.awt.PSurfaceAWT.SmoothCanvas) ((processing.awt.PSurfaceAWT)surface).getNative()).getFrame();
    java.awt.Point point = frame.getLocationOnScreen();
    location.set(point.x,point.y);
  }
  // P2D, P3D
  else if(surface instanceof processing.opengl.PSurfaceJOGL){
    com.jogamp.newt.opengl.GLWindow window = (com.jogamp.newt.opengl.GLWindow)(((PSurfaceJOGL)surface).getNative());
    com.jogamp.nativewindow.util.Point point = window.getLocationOnScreen(new com.jogamp.nativewindow.util.Point());
    location.set(point.getX(),point.getY());
  }
  // FX2D
  else if(surface instanceof processing.javafx.PSurfaceFX){
    javafx.scene.canvas.Canvas canvas = (javafx.scene.canvas.Canvas)((processing.javafx.PSurfaceFX)surface).getNative();
    javafx.geometry.Point2D point = canvas.localToScreen(0,0);
    location.set((float)point.getX(),(float)point.getY()); 
  }
  return location;
}

(使用导入,代码代码更为优雅,但由于我保留了完全合格的类名,因此可以更轻松地在新草图中复制/粘贴/测试该函数)