Swing en Java
Creación de interfaces con Java Swing
Swing es un conjunto de librerías que permiten la creación de interfaces gráficas de usuario (GUI) en Java. Swing viene incluida en el paquete JDK y es considerada una versión mejorada de la librería AWT.
Swing permite integrar y configurar un proyecto Java mediante un conjunto de elementos como pueden ser botones, cajas de texto, paneles, etc..., Los componentes de Swing son fácilmente diferenciables de otras librerías por llevar incorporada la letra J al comienzo del nombre (prefijo) del elemento, JPanel, JFrame, JButton. Además dispone de métodos que permiten configurar todos esos elementos, como pueden ser asignar un tamaño, un color, una fuente, integrar una imagen, etc...
VENTANAS
CREAR VENTANA
Para crear una ventana en Swing es necesario importar y extender la clase JFrame.
package ventana2;
import javax.swing.JFrame;
public class Ventana2 extends JFrame {
public Ventana2(){
setSize(200,200);
setTitle("Ventana básica");
}
public static void main(String[] args) {
Ventana2 ventana = new Ventana2();
ventana.setVisible(true);
}
}
CERRAR VENTANA CON EVENTOS
El cierre de la ventana se realiza mediante eventos que detectan la pulsación del botón de cierre.
package ventana2;
import javax.swing.JFrame;
public class Ventana2 extends JFrame {
public Ventana2(){
setSize(400,400);
setTitle("Cerrar ventana con evento");
initComponents();
}
public void initComponents(){
addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent evento){
System.exit(0);
}
});
}
public static void main(String[] args) {
Ventana2 ventana = new Ventana2();
ventana.setVisible(true);
}
}
CERRAR VENTANA CON setDefaultCloseOperation
Swing dispone del método setDefaultCloseOperation() que realiza la detección de evento automáticamente de forma sencilla. Este método permite cuatro constantes:
No realiza ninguna acción al accionar el cierre de ventana
Oculta la ventana pero no detiene la ejecución
Oculta solamente una ventana pero no detiene la ejecución
Detiene la ejecución del programa
package ventana2;
import javax.swing.JFrame;
public class Ventana2 extends JFrame {
public Ventana2(){
setSize(400,400);
setTitle("Cerrar ventana con evento");
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Ventana2 ventana = new Ventana2();
ventana.setVisible(true);
}
}
CONFIGURAR VENTANA
A continuación un ejemplo de una ventana que establece la configuración de anchura y altura, el título, la activación del botón de cierre, las dimensiones mínimas y el fondo.
package ventana2;
import java.awt.Dimension;
import javax.swing.JFrame;
public class Ventana2 extends JFrame {
public Ventana2(){
setSize(400,400);
setTitle("Cerrar ventana con evento");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setMinimumSize(new Dimension(200, 200));
this.getContentPane().setBackground(Color.Red);
}
public static void main(String[] args) {
Ventana2 ventana = new Ventana2();
ventana.setVisible(true);
}
}
CREAR PANEL
Un proyecto puede requerir más de una ventana, para ello, Swing permite crear dentro de la ventana los paneles necesarios.
package ventana2;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ventana2 extends JFrame {
public Ventana2(){
setVentana();
initComponents();
}
private void setVentana() {
setSize(400,400);
setTitle("Cerrar ventana con evento");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setMinimumSize(new Dimension(200, 200));
this.getContentPane().setBackground(Color.red);
}
private void newPanel(){
JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
this.getContentPane().add(panel);
}
private void initComponents(){
newPanel();
}
public static void main(String[] args) {
Ventana2 ventana = new Ventana2();
ventana.setVisible(true);
}
}
LAYOUT MANAGER
Java recomienda trabajar con gestores de diseño, con ellos se puede definir el estilo a los distintos paneles, permitiendo ordenar los elementos que contiene cada panel y evitando que al dimensionar éste no se descomponga, es decir, no se altere el orden y la dimensión de dichos elementos. A continuación algunos de los diseños más recomendados y utilizados.
BORDERLAYOUT
- private void newPanel(){
JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,200,200);
this.getContentPane().add(panel,BorderLayout.CENTER);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.red);
this.getContentPane().add(panel2,BorderLayout.NORTH);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.BLUE);
this.getContentPane().add(panel3,BorderLayout.SOUTH);
JPanel panel4 = new JPanel();
panel4.setBackground(Color.GRAY);
this.getContentPane().add(panel4,BorderLayout.EAST);
JPanel panel5 = new JPanel();
panel5.setBackground(Color.GREEN);
this.getContentPane().add(panel5,BorderLayout.WEST);
}
FLOWLAYOUT
private void newPanel(){
this.setLayout(new FlowLayout());
JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,200,200);
this.getContentPane().add(panel);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.white);
this.getContentPane().add(panel2);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.BLUE);
this.getContentPane().add(panel3);
JPanel panel4 = new JPanel();
panel4.setBackground(Color.GRAY);
this.getContentPane().add(panel4);
JPanel panel5 = new JPanel();
panel5.setBackground(Color.GREEN);
this.getContentPane().add(panel5);
}
BOXLAYOUT
private void newPanel(){
this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.X_AXIS));
JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,200,200);
this.getContentPane().add(panel);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.white);
this.getContentPane().add(panel2);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.BLUE);
this.getContentPane().add(panel3);
JPanel panel4 = new JPanel();
panel4.setBackground(Color.GRAY);
this.getContentPane().add(panel4);
JPanel panel5 = new JPanel();
panel5.setBackground(Color.GREEN);
this.getContentPane().add(panel5);
}
LAYOUT VACÍO
private void newPanel(){
JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,200,200);
this.getContentPane().add(panel);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.white);
panel2.setBounds(200,200,200,200);
this.getContentPane().add(panel2);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.BLUE);
panel3.setBounds(0,200,200,200);
this.getContentPane().add(panel3);
JPanel panel4 = new JPanel();
panel4.setBackground(Color.GRAY);
panel4.setBounds(200,0,200,200);
this.getContentPane().add(panel4);
JPanel panel5 = new JPanel();
panel5.setBackground(Color.GREEN);
panel5.setBounds(400,400,200,200);
this.getContentPane().add(panel5);
}
COMPONENTES
Java trabaja con objetos, también llamados componentes . Componente es cualquier elemento de un proyecto y a su vez puede contener uno o más componentes. Por tanto, una ventana es un componente que puede contener un panel que es otro componente que a su vez puede contener un botón que es otro componente. De esta forma el proyecto mantiene una estructura y un código ordenado.
ETIQUETAS
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel();
tag.setText("Etiqueta");
tag.setBounds(10, 10, 100, 30);
panel.add(tag);
}
CONFIGURAR ETIQUETAS
Color de fuente y fondo
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel();
tag.setText("Etiqueta");
tag.setBounds(10, 10, 100, 30);
tag.setForeground(Color.magenta);
tag.setBackground(Color.BLACK);
tag.setOpaque(true);
panel.add(tag);
}
Posición texto
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel("Etiqueta",SwingConstants.CENTER);
tag.setBounds(10, 10, 100, 30);
tag.setForeground(Color.magenta);
tag.setBackground(Color.BLACK);
tag.setOpaque(true);
panel.add(tag);
}
Fuentes
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel("Etiqueta",SwingConstants.CENTER);
tag.setBounds(10, 10, 100, 30);
tag.setForeground(Color.magenta);
tag.setBackground(Color.BLACK);
tag.setOpaque(true);
tag.setFont(new Font("arial", Font.BOLD,20));
panel.add(tag);
}
Fuentes externas
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel("Etiqueta",SwingConstants.CENTER);
tag.setBounds(10, 10, 200, 30);
tag.setForeground(Color.magenta);
tag.setBackground(Color.BLACK);
tag.setOpaque(true);
File myFont = new File("TheGodFather.ttf");
try{
Font font = Font.createFont(Font.TRUETYPE_FONT,myFont);
Font sizeFont = font.deriveFont(40f);
tag.setFont(sizeFont);
}catch(FontFormatException ex){
System.err.println("Error estableciendo fuente tipográfica");
}catch (IOException ex) {
System.err.println("Error I/O");
}
panel.add(tag);
}
IMAGEN EN ETIQUETA
- private void newPanel(){
- JPanel panel = new JPanel();
panel.setBackground(Color.ORANGE);
panel.setBounds(0,0,600,600);
panel.setLayout(null);
getContentPane().add(panel);
JLabel tag = new JLabel("Etiqueta",SwingConstants.CENTER);
tag.setBounds(10, 10, 200, 30);
tag.setForeground(Color.magenta);
tag.setBackground(Color.BLACK);
tag.setOpaque(true);
File myFont = new File("TheGodFather.ttf");
try{
Font font = Font.createFont(Font.TRUETYPE_FONT,myFont);
Font sizeFont = font.deriveFont(40f);
tag.setFont(sizeFont);
}catch(FontFormatException ex){
System.err.println("Error estableciendo fuente tipográfica");
}catch (IOException ex) {
System.err.println("Error I/O");
}
panel.add(tag);
//Imagen
ImageIcon emoticono = new ImageIcon("emoticono.jpeg");
JLabel emo = new JLabel();
//emo.setIcon(emoticono);
emo.setBounds(10,100,200,200);
emo.setIcon(new ImageIcon(emoticono.getImage().getScaledInstance(emo.getWidth(),emo.getHeight(),Image.SCALE_SMOOTH)));
- panel.add(emo);
}
BOTONES
private void addButton(){
button = new JButton("Hola");
button.setBounds(250,280,100,50);
//button.setText("Hola");
panel.add(button);
}
private void initComponents(){
addPanel();
addTag();
addButton();
}
BOTONES CON FUENTE
private void addButton(){
button = new JButton("Hola");
button.setBounds(250,280,100,50);
button.setForeground(Color.BLUE);
button.setFont(new Font("arial",Font.ITALIC,20));
panel.add(button);
}
BOTONES CON FUENTE EXTERNA
private void addButton(){
button = new JButton("Hola");
button.setBounds(250,280,100,50);
button.setForeground(Color.BLUE);
File myFont = new File("TheGodFather.ttf");
try{
Font font = Font.createFont(Font.TRUETYPE_FONT,myFont);
Font sizeFont = font.deriveFont(40f);
button.setFont(sizeFont);
}catch(FontFormatException ex){
System.err.println("Error estableciendo fuente tipográfica");
}catch (IOException ex) {
System.err.println("Error I/O");
}
panel.add(button);
}
FONDO DE BOTONES
private void addButton(){
button = new JButton("Hola");
button.setBounds(200,260,200,80);
button.setBackground(Color.magenta);
panel.add(button);
}
BORDE DE BOTONES
private void addButton(){
button = new JButton("Hola");
button.setBounds(200,260,200,80);
button.setOpaque(false);
button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
button.setBackground(Color.green);
panel.add(button);
}
CONFIGURACIÓN DE BORDE (BISEL)
private void addButton(){
button = new JButton("Hola");
button.setBounds(200,260,200,80);
button.setOpaque(true);
button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.yellow,Color.black));
button.setBackground(Color.green);
panel.add(button);
}
private void addButton(){
button = new JButton("Hola");
button.setBounds(200,260,200,80);
button.setOpaque(true);
button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.white,Color.black,Color.GRAY,Color.BLACK));
button.setBackground(Color.green);
panel.add(button);
}
CONFIGURACIÓN DE BORDE (LINEA)
private void addButton(){
button = new JButton("Hola");
button.setBounds(200,260,200,80);
button.setOpaque(true);
button.setBorder(BorderFactory.createLineBorder(Color.gray,5, true));
button.setBackground(Color.lightGray);
panel.add(button);
}
EVENTOS
MouseListener
MouseClicked
Detecta que el botón del ratón ha sido pulsado
MousePressed
Detecta que el botón del ratón está siendo pulsado
MouseReleased
Detecta que el botón se ha soltado, si es movido mientras está pulsado no detecta MouseClicked
MouseEntered
Detecta el ratón sobre el área del elemento
MouseExited
Detecta el ratón fuera del área del elemento
private void actionMouse(){
button.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
button.setBackground(Color.green);
}
@Override
public void mousePressed(MouseEvent e) {
button.setBackground(Color.red);
}
@Override
public void mouseReleased(MouseEvent e) {
button.setBackground(Color.orange);
button.setText("Color naranja");
}
@Override
public void mouseEntered(MouseEvent e) {
button.setBackground(Color.black);
}
@Override
public void mouseExited(MouseEvent e) {
button.setBackground(Color.white);
}
});
}
MouseMotionListener
MouseDragged
Detecta el movimiento del ratón pulsado sobre el área del botón.
MouseMoved
Detecta el movimiento sobre el área del botón.
private void actionMouse(){
button.addMouseMotionListener(new MouseMotionListener(){
@Override
public void mouseDragged(MouseEvent e) {
button.setBackground(Color.pink);
}
@Override
public void mouseMoved(MouseEvent e) {
button.setBackground(Color.red);
}
});
}
MouseWheelListener
MouseWheelMoved
Detecta el movimiento de la rueda del ratón.
private void actionMouse(){
button.addMouseWheelListener(new MouseWheelListener(){
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
button.setBackground(Color.DARK_GRAY);
button.setForeground(Color.white);
}
});
}
ActionListener
ActionPerformed
Detecta alguna acción que ocurre en algún elemento como pulsar un botón, pulsar Enter en una caja de texto o desplegar un menú.
private void action(){
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.print(e);
button.setBackground(Color.red);
}
});
}
KeyListener
keyTyped
Detecta que una tecla ha sido pulsada, si existe la misma acción que keyPressed la sobreescribe.
keyPressed
Detecta una tecla presionada.
keyReleased
Detecta una tecla soltada.
private void action(){
button.addKeyListener(new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {
button.setText("click");
button.setBackground(Color.white);
}
@Override
public void keyPressed(KeyEvent e) {
button.setText("tecla presionada");
}
@Override
public void keyReleased(KeyEvent e) {
button.setText("tecla soltada");
}
});
}
Lista orientativa de componentes Swing y listeners recomendables.
Para poder comentar es necesario iniciar sesión