Hi,
For the last days, I have been playing with PApplet’s and creating multiple windows.
After some long research I found this post on the forum (Closing a second window)
Now, I tried to modify the code to reopen and close the second window using a button / clicking the main window. This is part of a bigger project but I just wanted to make sure that I am doing this correctly.
So, to “close” the second window (which in truth is hiding it), when pressing the close button I need to call the makeVisible() method correct and set it to false right? And this should stop the second window from running correct? I am a bit confused still with this and the setDefaultClosePolicy().
And to reopen I just simply make it visible again?
(I know the code is working, just wanted to make sure that things are correctly set)
Is there a way to actually close the window instead for good? Or hiding it does not consume processing time?
The code that I am using is the one below:
PWindow win;
Button b;
public void settings() {
  size(320, 240);
}
void setup() { 
  surface.setLocation(20, 20);
  win = new PWindow();
}
void draw() {
  background(255, 0, 0);
  fill(0);
  rect(0, 0, width/2, height);
  fill(240);
  rect(width/2, 0, width, height);
  textAlign(CENTER, CENTER);
  text("CLICK to reopen\nsecond window", width/4, height/2);
  fill(0);
  textAlign(CENTER, CENTER);
  text("CLICK to close\nsecond window", 3*width/4, height/2);
}
void mousePressed() {
  println("mousePressed in primary window");
  if (mouseX >= 0 && mouseX < width/2) win.makeVisible(true);
  else win.makeVisible(false);
} 
@Override 
  void exit() {
  win.dispose();
  super.exit();
}
class PWindow extends PApplet {
  static final String RENDERER = P2D;
  PFont TXTfont;
  Button b;
  PWindow() {
    super();
    PApplet.runSketch(new String[] {this.getClass().getSimpleName()}, this);
  }
  void settings() {
    size(500, 200, RENDERER);
  }
  void setup() {
    background(0);
    setDefaultClosePolicy(this, false);
    TXTfont = createFont("Arial", 13);
    b = new Button("CLOSE", width/2, height/2, 50, 30, this);
  }
  void draw() {
    fill(240);
    b.display();
    println("running PWINDOW!", frameCount);
  }
  void mousePressed() {
    println("mousePressed in secondary window");
    if (b.over()) {
      println("BUTTON CLICKED");
      makeVisible(false);
    }
  }
  final void setDefaultClosePolicy(PApplet pa, boolean keepOpen) {
    final Object surf = pa.getSurface().getNative();
    final PGraphics canvas = pa.getGraphics();
    if (canvas.isGL()) {
      final com.jogamp.newt.Window w = (com.jogamp.newt.Window) surf;
      for (com.jogamp.newt.event.WindowListener wl : w.getWindowListeners())
        if (wl.toString().startsWith("processing.opengl.PSurfaceJOGL"))
          w.removeWindowListener(wl); 
      w.setDefaultCloseOperation(keepOpen?
        com.jogamp.nativewindow.WindowClosingProtocol.WindowClosingMode
        .DO_NOTHING_ON_CLOSE :
        com.jogamp.nativewindow.WindowClosingProtocol.WindowClosingMode
        .DISPOSE_ON_CLOSE);
    } else if (canvas instanceof processing.awt.PGraphicsJava2D) {
      final javax.swing.JFrame f = (javax.swing.JFrame)
        ((processing.awt.PSurfaceAWT.SmoothCanvas) surf).getFrame(); 
      for (java.awt.event.WindowListener wl : f.getWindowListeners())
        if (wl.toString().startsWith("processing.awt.PSurfaceAWT"))
          f.removeWindowListener(wl);
      f.setDefaultCloseOperation(keepOpen?
        f.DO_NOTHING_ON_CLOSE : f.DISPOSE_ON_CLOSE);
    }
  }
  public void makeVisible(boolean state)
  {
    surface.setVisible(state);
  }
}
Button class:
class Button {
  String name;
  color defaultColor, rectColor, overColor;
  float xpos, ypos, rectWidth, rectHeight, roundedCornerSize;
  PFont buttonFont;
  color c2;
  PApplet parent;
  Button(String _name, float _xpos, float _ypos, float _rectWidth, float _rectHeight, PApplet parent) {
    this.parent = parent;
    this.name = _name;
    this.xpos = _xpos;
    this.ypos = _ypos;
    this.rectWidth = _rectWidth;
    this.rectHeight = _rectHeight;
    this.roundedCornerSize = 5;
    this.buttonFont = createFont("Calibri", 15);
  }
  // Display the button
  void display() {   
    parent.rectMode(CENTER); //Draw the rectangle representing the button
    if (over()) {
      c2=color(222, 242, 252);
    } else {
      c2=color(240, 240, 240);
    }
    parent.noStroke();               
    parent.fill(c2); 
    parent.rect(xpos, ypos, rectWidth, rectHeight, roundedCornerSize);
    // Place the name of the button 
    parent.fill(0);
    parent.textFont(buttonFont);
    parent.textAlign(CENTER, CENTER);
    parent.text(this.name, this.xpos, this.ypos-2);
  }  
  // Function to determine if mouser is over the button
  boolean over() {
    return (parent.mouseX >= xpos-rectWidth/2 && parent.mouseX <= xpos+rectWidth/2 && 
      parent.mouseY >= ypos-rectHeight/2 && parent.mouseY <= ypos+rectHeight/2) ;
  }
}
Thanks in advance!
Any improvements to the code are also welcome 
I am trying to learn as much as possible on this new topic
Best regards!