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");
}

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