miércoles, 30 de agosto de 2017

Integrar Java Swing en Processing

Integración de Java Swing en Processing

Estructura básica

Este ejemplo de código implementa la creación del panel en el cual se agregaran los controles de la aplicación en Processing. En la siguiente figura se muestra las ventanas resultantes para este ejemplo, la tradicional ventana correspondiente al lienzo o sketch de Processing y otra correspondiente al aplicativo Java con Swing.
A partir de esta plantilla básica se procede a desarrollar la aplicación agregando botones, sliders, etc.

Ventanas estructura básica.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

MyPanel controlPanel= new MyPanel();
 void setup() {
  JFrame frame = new JFrame("Ejemplo Frame");
  frame.setContentPane(controlPanel);
  frame.pack();
  frame.setVisible(true);
}
void draw() {
}
public class MyPanel extends JPanel {
    public MyPanel() {
       setPreferredSize(new Dimension(200, 400));
       setLayout(null);
   }
}

Agregando Botones

Este ejemplo de código implementa agrega un botón y el evento de click para este botón.
En el ejemplo el botón se llama boton01 pero puede tener cualquier otro nombre, pero se sugiere que para distinguir varios botones en la aplicación estos tengan en su nombre una numeración.
el método boton01.setBounds(0, 0, 200, 25); sirve para indicar la posición y tamaño del botón en el panel, su formato es el siguiente setBounds(x,y,ancho,alto) donde las coordenadas x,y corresponden a la esquina superior izquierda y ancho, alto a las dimensiones del botón.
Para agregar el evento de click se emplea el método y en este se indica como se llama la clase que implementa el método boton01.addActionListener(new ClickBoton01()); para detectar el evento de click en este botón. Para este ejemplo al clase se llama ClickBoton01 pero el nombre puede ser cualquiera, es importante indicar que por lo general cada botón tiene su propio evento de click indicado con un nombre que lo diferencia de los demás.
 
Creación de un botón.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

MyPanel controlPanel= new MyPanel();
 void setup() {
  JFrame frame = new JFrame("Ejemplo Frame");
  MyPanel controlPanel= new MyPanel();
  frame.setContentPane(controlPanel);
  frame.pack();
  frame.setVisible(true);
}
void draw() {
}
public class MyPanel extends JPanel {
  private JButton boton01;
  public MyPanel() {
    setPreferredSize(new Dimension(200, 400));
    setLayout(null);
    boton01 = new JButton ("Presionar");
    boton01.setBounds(0, 0, 200, 25);
    add(boton01);
    boton01.addActionListener(new ClickBoton01());
  }
}
class ClickBoton01 implements ActionListener{
  public void actionPerformed(ActionEvent e){
    JButton b = (JButton)e.getSource();
    b.setLabel("Presionado");
  }


Cambiar el Color de Fondo del Sketch al Presionar un Botón

Este ejemplo permite cambiar el color de fondo de blanco a negro y viceversa al presionar un único botón, para esto se agrega una variable de tipo booleano que cambia de estado cada vez que se presiona el botón.

Botón para cambiar color de fondo


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
MyPanel controlPanel= new MyPanel();
boolean banderaBoton01 = true;
void setup() {
  JFrame frame = new JFrame("Ejemplo Frame");

  frame.setContentPane(controlPanel);
  frame.pack();
  frame.setVisible(true);
  size(400,400);
}
void draw() {
  if (banderaBoton01) {
    background(255);//Blanco
  } else {
    background(0);//Falso
  }
}
public class MyPanel extends JPanel {
  private JButton boton01;
  public MyPanel() {//Metodo constructor
    setPreferredSize(new Dimension(200, 400));
    setLayout(null);
    boton01 = new JButton ("Blanco");
    boton01.setBounds(0, 0, 200, 25);
    add(boton01);
    boton01.addActionListener(new ClickBoton01());
  }
}
class ClickBoton01 implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    JButton b = (JButton)e.getSource();
    banderaBoton01=!banderaBoton01;//Cambia de estado al negarse a si misma
    if (banderaBoton01) {
      b.setLabel("Blanco");
    } else {
      b.setLabel("Negro");
    }
   
  }
}

Cambiar el Color del panel y el botón

Los objetos de Swing como los botones y paneles tienen propiedades de color que se pueden cambiar con el metodo setBackground() .
Los colores que se pueden seleccionar directamente son: Color.lightGray Color.gray Color.darkGray Color.blue Color.cyan Color.green Color.yellow Color.magenta Color.orange Color.pink Color.red Color.white Color.black
Para agregar un color empleando el formato RGB empleamos la objeto Color que en este ejemplo se utilizo  de la siguiente manera para cunado se presiona el botón b.setBackground(new Color( 128, 0, 32 ));

Panel gris y botón amarillo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

MyPanel controlPanel= new MyPanel();
 void setup() {
  JFrame frame = new JFrame("Ejemplo Frame");
  frame.setContentPane(controlPanel);
  frame.pack();
  frame.setVisible(true);
}
void draw() {
}
public class MyPanel extends JPanel {
  private JButton boton01;
  public MyPanel() {
    setPreferredSize(new Dimension(200, 400));
    setLayout(null);
    setBackground(Color.gray);//Color del panel
    boton01 = new JButton ("Presionar");
    boton01.setBounds(0, 0, 200, 25);
    boton01.setBackground(Color.yellow);//Color del boton
    add(boton01);
    boton01.addActionListener(new ClickBoton01());
  }
}
class ClickBoton01 implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    JButton b = (JButton)e.getSource();
    b.setLabel("Presionado");
    b.setBackground(new Color( 128, 0, 32 ));
  }


Cambiar valores de los controles desde la función  draw()

Las propiedades de los objetos pueden ser cambiados desde la función draw(), en este ejemplo se visualiza el tiempo transcurrido en milisegundo en una etiqueta JLabel esto se hace con la siguiente isntruccion donde se modifica la propiedad del texto controlPanel.texto01.setText(str(millis())); donde el metodo setText cambia el texto que es de tipo string. Para convertir el valor entero de la funcion millis() se emplea la funcion srt() que convierte un dato tipo int o float a una cadena de caracteres string
 
Mostrar tiempo en milisegundos

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
boolean baderaCrono = false;
MyPanel controlPanel= new MyPanel();
void setup() {
  JFrame frame = new JFrame("Cronometro");
  frame.setContentPane(controlPanel);
  frame.pack();
  frame.setVisible(true);
}
void draw() {
  if (baderaCrono) {
    controlPanel.texto01.setText(str(millis()));
  }
}
public class MyPanel extends JPanel {
  private JButton boton01;
  private JLabel texto01;
  public MyPanel() {
    setPreferredSize(new Dimension(200, 400));
    setLayout(null);
    boton01 = new JButton ("Cronometrar");
    boton01.setBounds(0, 0, 200, 25);
    add(boton01);
    boton01.addActionListener(new ClickBoton01());
    texto01= new JLabel("0");
    texto01.setBounds(0, 25, 200, 25);
    texto01.setForeground(Color.blue);
    add(texto01);
  }
}
class ClickBoton01 implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    JButton b = (JButton)e.getSource();
    baderaCrono=!baderaCrono;
    if (baderaCrono) {
      b.setLabel("Pausar");
    } else {
      b.setLabel("Cronometrar");
    }
  }
}

No hay comentarios:

Publicar un comentario