Curso de Java Swing

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Componente JFrame en un proyecto Java Swing

JFrame frame = new JFrame("Nombre de la ventana"); // Creamos la ventana con un titulo
frame.setSize(800,600); //le asignamos un tamaño
//frame.setLocation(0,0); //Definimos el origen de coordenadas de la ventana
frame.setLocationRelativeTo(null);//Centra la ventana en la pantalla
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//definimos que pasará cuando pulsemos el botón de cerrar
frame.setVisible(true); //La hacemos visible

Crear un componente y añadirlo a la ventana

JButton button = new JButton("Texto boton");
frame.add(button);

Sin haber establecido un layout, el botón se estirará para ocupar toda la pantalla

Para evitar esto, podemos usar un layout, por ejemplo:

frame.setLayout(new FlowLayout());

Si queremos que los componentes se alineen verticalmente, no es posible usando FlowLayout, pero podemos crear una nueva clase llamada VerticalFlowlayout

Algunos componentes de Java Swing

JTextArea ciclosTextArea = new JTextArea(15,20);

//Muestra un mensaje no editable
JLabel label = new JLabel("nombre");

//Muestra un cuadro de diálogo con un mensaje
JOptionPane.showMessageDialog(Ventana.this, "Eggs are not supposed to be green."); 

Forma habitual de instanciar una ventana

public class Main {
	public static void main(String[] args) {
		Ventana ventana = new Ventana();
		ventana.setVisible(true);
	}
}
public class Ventana extends JFrame {
	public Ventana() {
		inicializar();
	}
	private void inicializar() {
		this.setSize(800,600);
	}
}

Componente JButton en Java Swing

JButton btn= new JButton("Botón");
btn.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {		
	if(e.getSource() == this.hacerMagia) {
			
	}else if(e.getSource() == this.altaCurso) {
			
	}
}

o

.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		int row = tabla.getSelectedRow();
		listadoCursos.remove(row);
		alimentarTabla();
		System.out.println(row);
	}
});

Layouts de Java Swing

BorderLayout

Por defecto, si no indicamos nada, nuestras ventanas tienen BorderLayout.

JButton btn1 = new JButton("btn1");
JButton btn2 = new JButton("btn2");
		
this.add(btn1);
this.add(btn2);

BoxLayout

BoxLayout.PAGE_AXIS coloca los elementos verticalmente, de arriba a abajo
this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
		
JButton btn1 = new JButton("btn1");
JButton btn2 = new JButton("btn2");
		
this.add(btn1);
this.add(btn2);

Group Layout

Esto es un poco enrevesado. Para que funcione correctamente tengo que añadir todos los componentes dos veces, una horizontal y otra verticalemente

	GroupLayout layout = new GroupLayout(this.getContentPane());
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);

layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(btn1).addComponent(btn2).addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(btn3).addComponent(btn4)));

layout.setVerticalGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(btn1).addComponent(btn2).addComponent(btn3)).addComponent(btn4));


this.setLayout(layout);

Componente JTable en Java Swing

String data[][]={ {"101","Amit","670000"},{"102","Jai","780000"},{"101","Sachin","700000"}};    
// (es posible incrustar código html si lo hacemos dentro de las etiquetas <html>)
String columns[]={"Ciclo","Módulo","<html>Unidad<br>Formativa>","Opcion"};         
JTable tabla=new JTable(cursillos,column);    
tabla.setBounds(30,40,200,300);          
JScrollPane sp=new JScrollPane(tabla); 

sp.setPreferredSize(new Dimension(1000, 300));
sp.setMinimumSize(new Dimension(1000,200));

panelGlobal.add(sp);

Cambiar el header de la tabla

tabla = new JTable();
JTableHeader th = tabla.getTableHeader();
th.setPreferredSize(new Dimension(100, 100));

Si sólo quisiera modificar la altura de la tabla, pero no su anchura

JTableHeader th = tabla.getTableHeader();
		
Dimension d = th.getPreferredSize();
d.height = 30;
th.setPreferredSize(d);

Alimentar la tabla sin usar su constructor

DefaultTableModel tableModel = new DefaultTableModel(cursillos, columns);
tabla.setModel(tableModel);

Alimentando la tabla con un ArrayList

String[][] arrayListCursoToMultidimensionalStringArray(ArrayListcursos){
	Iterator<Curso> it = cursos.iterator();
	String [][] cursosArray= new String[cursos.size()][3];
	int i=0;
	while(it.hasNext()) {
		Curso c = it.next();
		String[]curso = {c.getCiclo(), c.getModulo(), c.getUf(), "X"};
		cursosArray[i] =curso; 
		i++;
	}
	return cursosArray;	
}

Añadiendo un listener a la tabla

JTable jt=new JTable(cursillos,column);   

jt.addMouseListener(new MouseAdapter() {
	public void mousePressed(MouseEvent e) {
		System.out.println("llega");
	}
});

Añadir un popup al pulsar sobre una fila

JPopupMenu popup = new JPopupMenu();
JMenuItem removeItem = new JMenuItem("Eliminar fila");
popup.add(removeItem);

JTable tabla=new JTable(cursillos,column);   

tabla.addMouseListener(new MouseAdapter() {
	public void mousePressed(MouseEvent e) {
		popup.show(jt, e.getX(), e.getY());
	}
});

Materializar la opción de borrado

removeItem.addActionListener(new ActionListener() {
	
	@Override
	public void actionPerformed(ActionEvent e) {
		int row = tabla.getSelectedRow();
		System.out.println(row);
	}
});

Tabs

JTabbedPane tabbedPane = new JTabbedPane();

tabbedPane.add("Colors", new JPanel());
tabbedPane.add( "Fruits", new JPanel());
tabbedPane.add("Vitamins", new JPanel( ) ) ;
	 
panelGlobal.add(tabbedPane);

Para modificar dinámicamente el contenido de un tab:

tabbedPane.setComponentAt(2, panelCursos);

Cómo crear un Menú con Java Swing

JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Archivo");
JMenuItem importarMenuItem = new JMenuItem("Importar");
JMenuItem exportarMenuItem = new JMenuItem("Exportar");

fileMenu.add(importarMenuItem);
fileMenu.add(exportarMenuItem);

menuBar.add(fileMenu);
this.setJMenuBar(menuBar);

Cuadro de diálogo para abrir/salvar ficheros

Abrir un ficheroJFileChooser c = new JFileChooser();				
int rVal = c.showOpenDialog(Ventana.this);
if (rVal == JFileChooser.APPROVE_OPTION) {
	System.out.println(c.getSelectedFile().getName());
	System.out.println(c.getCurrentDirectory().toString());
}
if (rVal == JFileChooser.CANCEL_OPTION) {
	System.out.println("Pulsaste cancelar");
}

Componente JFrame en un proyecto Java Swing →