Hi, are there any examples that use (import) processing classes in combination with the classic pure Graphics2D environment outside Processing? I mean not just extending the Processing Applet (the new window), but extending the Graphics2D code base with Processing Objects (like a normal compatible library will do). Do we face total inconsistency or we can use them somehow in parallel considering maybe their “coordinate system” idiosyncrasies?
Can Objects like PVectors, be used outside of the Applet, to construct e.g. Point2Ds, Shapes, Path2Ds, etc, or make some i/o operations between them in order to “upgrade” somehow Graphics2D capabilities in a pure java environment? Could this be possible in practice or we consider those environments totally different? If they are different, is there any other “hacky” way to parse the Applet’s x,y image (or a state of it in time) produced from the Processing (PImage, PSurfice …) and parse this image as a Graphics2D raster object? What about vectors?
I am not an experienced Processing user, hopefully this question will make sense in order to see and clarify capabilities and possible options.
Thanks in advance.
I don’t know If thats what you’re looking for but you can easily access the jframe the processing-window would produce and pack the content-pane in a jframe of your own.
You can extend the PApplet to create a processing-window wich you can hide said window and save the contents as an image. If that interests you I can put some code together.
The following may or may not be what you are inquiring about. The demo shows how to use Java2D inside of a Processing app with a JFrame and a JPanel drawing component. Should run in Processing 4.
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
javax.swing.JFrame frame;
java.awt.Canvas canvas;
int _wndW = 400;
int _wndH = 300;
JPanel panel;
Graphics2D g2d;
class DrawPanel extends JPanel {
public DrawPanel() {
setBounds(0, 0, _wndW, _wndH);
setOpaque(false);
}
@Override
public void paintComponent(Graphics g) {
g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g2d);
// **** Rectangle2D **** //
Rectangle2D rect = new Rectangle2D.Double(60,100,200,100);
g2d.draw(rect);
// **** Ellipse2D **** //
Ellipse2D ellipse = new Ellipse2D.Double();
ellipse.setFrame(rect);
g2d.draw(ellipse);
// **** Line2D **** //
Line2D line = new Line2D.Double(60,100,260,200);
g2d.draw(line);
// **** Text **** //
g2d.setPaint(Color.RED);
Font txtFont = new Font("Monospaced", Font.BOLD, 24);
g2d.setFont(txtFont);
g2d.drawString("JAVA2D",100,60);
}
}
void buildWnd() {
panel = new DrawPanel();
frame.add(panel);
panel.repaint();
frame.setVisible(true);
}
void setup() {
frame = (javax.swing.JFrame) ((processing.awt.PSurfaceAWT.SmoothCanvas) surface.getNative()).getFrame();
canvas = (processing.awt.PSurfaceAWT.SmoothCanvas) ((processing.awt.PSurfaceAWT)surface).getNative();
frame.setBounds(500, 300, _wndW, _wndH);
frame.remove(canvas);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
buildWnd(); // Builds components on EventDispatchThread
}
});
}
Output:
thanks everyone, this is useful info, but svan solution is about embedding Graphics2D to processing IDE, I am describing the opposite, to embed a sketch (or a state of it in time) in an other app that resides in an other classic Java IDE. Lest say we have a native java graphics app and there we want if possible to add:
-
Code as usual and produce graphics as (paint) components inside this app, not a processing one with GUI, use processing classes, produce graphics in any place not only in the standalone PApplet window. Maybe this is nearly impossible.
-
If the above is not possible, find a way to parse a Processing raster (PImage, PSurfice,…) in a paint component, a raster can be rendered () something like the WritableRaster.
WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
//...processing code (?)
}
- Other intermediate ways(?) like this one: java - Adding processing 3 to a Jpanel - Stack Overflow
If those are the final options, I guess the 3rd one is the only way embedding a PSurfice to a Native JPanel outside of processing IDE.
copying the link code here for convenience:
import javax.swing.JFrame;
import processing.awt.PSurfaceAWT.SmoothCanvas;
import processing.core.PApplet;
import processing.core.PSurface;
public class ProcessingTest extends PApplet{
public void settings(){
size(200, 200);
}
public void draw(){
background(0);
ellipse(mouseX, mouseY, 20, 20);
}
public static void main(String... args){
//create your JFrame
JFrame frame = new JFrame("JFrame Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//create your sketch
ProcessingTest pt = new ProcessingTest();
//get the PSurface from the sketch
PSurface ps = pt.initSurface();
//initialize the PSurface
ps.setSize(200, 200);
//get the SmoothCanvas that holds the PSurface
SmoothCanvas smoothCanvas = (SmoothCanvas)ps.getNative();
//SmoothCanvas can be used as a Component
frame.add(smoothCanvas);
//make your JFrame visible
frame.setSize(200, 200);
frame.setVisible(true);
//start your sketch
ps.startThread();
}
}
If anyone has alternative solutions, please share them
The following source code runs in IntelliJ. Key is to add core.jar from Processing 4 app bundle to Libraries.
import processing.core.PApplet;
public class Main extends PApplet {
// The argument passed to main must match the class name
public static void main(String[] args) {
PApplet.main("Main");
}
// method used only for setting the size of the window
public void settings(){
size(400, 400);
}
// identical use to setup in Processing IDE except for size()
public void setup(){
background(209);
stroke(0);
strokeWeight(5);
}
// identical use to draw in Processing IDE
public void draw(){
circle(width/2,height/2,150);
}
}