Saltar al contenido principal

Componentes avanzados

JList — Lista de elementos

// Crear con array
String[] datos = {"Manzana", "Pera", "Naranja", "Plátano"};
JList<String> lista = new JList<>(datos);

// Modo de selección
lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, MULTIPLE_INTERVAL_SELECTION

// Siempre dentro de un JScrollPane
JScrollPane scroll = new JScrollPane(lista);
scroll.setPreferredSize(new Dimension(200, 150));

// Leer selección
String seleccionado = lista.getSelectedValue();
int[] indices = lista.getSelectedIndices();
java.util.List<String> seleccionados = lista.getSelectedValuesList();

// Modelo mutable (permite añadir/quitar en tiempo de ejecución)
DefaultListModel<String> modelo = new DefaultListModel<>();
modelo.addElement("Elemento 1");
modelo.addElement("Elemento 2");
modelo.removeElement("Elemento 1");
modelo.set(0, "Modificado");

JList<String> listaModelo = new JList<>(modelo);

// Listener de selección
lista.addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) { // Evitar disparos dobles
System.out.println("Seleccionado: " + lista.getSelectedValue());
}
});

// Doble clic en elemento
lista.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
System.out.println("Doble clic: " + lista.getSelectedValue());
}
}
});

Renderer personalizado para JList

lista.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {

JLabel label = (JLabel) super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);

// Personalizar según el índice
if (index % 2 == 0) {
label.setBackground(isSelected ? list.getSelectionBackground() : new Color(240, 240, 255));
}
label.setIcon(new ImageIcon("item.png")); // Icono en cada elemento
return label;
}
});

JTable — Tabla de datos

// Datos y columnas
Object[][] datos = {
{"Ana García", 25, "Madrid", true},
{"Luis Pérez", 30, "Sevilla", false},
{"María López", 22, "Madrid", true}
};
String[] columnas = {"Nombre", "Edad", "Ciudad", "Activo"};

JTable tabla = new JTable(datos, columnas);
JScrollPane scroll = new JScrollPane(tabla); // SIEMPRE con scroll

// Configuración básica
tabla.setRowHeight(25);
tabla.setFillsViewportHeight(true);
tabla.setAutoCreateRowSorter(true); // Ordenar clicando en cabecera

// Selección
tabla.setSelectionMode(ListSelectionModel.SINGLE_ROW_SELECTION);
// SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, MULTIPLE_INTERVAL_SELECTION

// Leer fila seleccionada
int fila = tabla.getSelectedRow();
int filaModelo = tabla.convertRowIndexToModel(fila); // Importante si hay ordenación
if (fila >= 0) {
String nombre = (String) tabla.getValueAt(fila, 0);
}

DefaultTableModel — Tabla con datos dinámicos

DefaultTableModel modelo = new DefaultTableModel(columnas, 0); // 0 filas iniciales

// Añadir filas
modelo.addRow(new Object[]{"Pedro", 28, "Bilbao", true});
modelo.addRow(new Object[]{"Sofía", 33, "Valencia", false});

// Modificar
modelo.setValueAt("Carmen", 0, 0);

// Eliminar
modelo.removeRow(0);

// Limpiar
modelo.setRowCount(0);

JTable tabla = new JTable(modelo);

// Listener de cambios en datos
modelo.addTableModelListener(e -> {
System.out.println("Datos cambiados en fila: " + e.getFirstRow());
});

// Listener de selección de fila
tabla.getSelectionModel().addListSelectionListener(e -> {
if (!e.getValueIsAdjusting() && tabla.getSelectedRow() >= 0) {
int fila = tabla.convertRowIndexToModel(tabla.getSelectedRow());
System.out.println("Fila: " + modelo.getValueAt(fila, 0));
}
});

Personalizar columnas de JTable

TableColumnModel colModel = tabla.getColumnModel();

// Ancho de columna
colModel.getColumn(0).setPreferredWidth(150);
colModel.getColumn(1).setPreferredWidth(50);

// Columna no redimensionable
colModel.getColumn(2).setResizable(false);

// Renderizador personalizado para una columna
colModel.getColumn(3).setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable t, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {

JLabel label = (JLabel) super.getTableCellRendererComponent(
t, value, isSelected, hasFocus, row, col);

Boolean activo = (Boolean) value;
label.setText(activo ? "✓ Sí" : "✗ No");
label.setForeground(activo ? new Color(0, 128, 0) : Color.RED);
label.setHorizontalAlignment(JLabel.CENTER);
return label;
}
});

// Editor personalizado (ComboBox como editor de celda)
JComboBox<String> comboEditor = new JComboBox<>(new String[]{"Madrid", "Sevilla", "Barcelona"});
colModel.getColumn(2).setCellEditor(new DefaultCellEditor(comboEditor));

JTree — Árbol jerárquico

// Crear nodos
DefaultMutableTreeNode raiz = new DefaultMutableTreeNode("Empresa");

DefaultMutableTreeNode dept1 = new DefaultMutableTreeNode("Ingeniería");
dept1.add(new DefaultMutableTreeNode("Ana García"));
dept1.add(new DefaultMutableTreeNode("Luis Pérez"));

DefaultMutableTreeNode dept2 = new DefaultMutableTreeNode("Marketing");
dept2.add(new DefaultMutableTreeNode("María López"));

raiz.add(dept1);
raiz.add(dept2);

JTree arbol = new JTree(raiz);
arbol.setRootVisible(true); // Mostrar la raíz
arbol.setShowsRootHandles(true); // Triángulos de expansión

// Expandir todo
for (int i = 0; i < arbol.getRowCount(); i++) {
arbol.expandRow(i);
}

JScrollPane scroll = new JScrollPane(arbol);

// Listener de selección
arbol.addTreeSelectionListener(e -> {
DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) arbol.getLastSelectedPathComponent();
if (nodo != null) {
System.out.println("Seleccionado: " + nodo.getUserObject());
System.out.println("¿Es hoja? " + nodo.isLeaf());
}
});

// Listener de expansión/colapso
arbol.addTreeExpansionListener(new TreeExpansionListener() {
@Override
public void treeExpanded(TreeExpansionEvent e) {
System.out.println("Expandido: " + e.getPath());
}
@Override
public void treeCollapsed(TreeExpansionEvent e) {
System.out.println("Colapsado: " + e.getPath());
}
});

JTabbedPane — Panel con pestañas

JTabbedPane pestanas = new JTabbedPane();

// Añadir pestañas
pestanas.addTab("General", new JPanel());
pestanas.addTab("Avanzado", new JPanel());
pestanas.addTab("Ayuda", new ImageIcon("help.png"), new JPanel(), "Tooltip de ayuda");

// Deshabilitar una pestaña
pestanas.setEnabledAt(1, false);

// Cambiar pestaña activa
pestanas.setSelectedIndex(0);
int actual = pestanas.getSelectedIndex();

// Posición de las pestañas
pestanas.setTabPlacement(JTabbedPane.TOP); // TOP, BOTTOM, LEFT, RIGHT

// Listener
pestanas.addChangeListener(e -> {
System.out.println("Pestaña activa: " + pestanas.getSelectedIndex());
});

// Pestaña con componente personalizado en la cabecera
JPanel cabeceraPestana = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
cabeceraPestana.add(new JLabel("Config "));
JButton btnCerrar = new JButton("×");
btnCerrar.setMargin(new Insets(0, 3, 0, 3));
btnCerrar.addActionListener(e -> pestanas.remove(pestanas.getSelectedIndex()));
cabeceraPestana.add(btnCerrar);

pestanas.addTab(null, new JPanel());
pestanas.setTabComponentAt(pestanas.getTabCount() - 1, cabeceraPestana);

JSplitPane — Panel dividido

// División horizontal (izquierda / derecha)
JSplitPane split = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
new JScrollPane(arbol), // Panel izquierdo
new JScrollPane(tabla) // Panel derecho
);

split.setDividerLocation(200); // Posición inicial del divisor en píxeles
split.setDividerSize(8); // Grosor del divisor
split.setOneTouchExpandable(true); // Flechitas para colapsar lados
split.setContinuousLayout(true); // Redibujar mientras se arrastra

// División vertical (arriba / abajo)
JSplitPane splitV = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panelSuperior, panelInferior);
splitV.setResizeWeight(0.5); // 50% del espacio para cada panel al redimensionar

JScrollPane — Panel con scroll

JTextArea area = new JTextArea(10, 40);

// Scroll completo
JScrollPane scroll = new JScrollPane(area);

// Control de barras de desplazamiento
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// Opciones: ALWAYS, NEVER, AS_NEEDED (defecto)

// Velocidad de scroll
scroll.getVerticalScrollBar().setUnitIncrement(16);

// Scroll hasta el inicio / final
JTextArea ta = (JTextArea) scroll.getViewport().getView();
ta.setCaretPosition(0); // Al inicio
ta.setCaretPosition(ta.getText().length()); // Al final

JMenuBar, JMenu y JMenuItem — Menús

// Crear barra de menús
JMenuBar menuBar = new JMenuBar();

// Menú Archivo
JMenu menuArchivo = new JMenu("Archivo");
menuArchivo.setMnemonic(KeyEvent.VK_A); // Alt+A

JMenuItem itmNuevo = new JMenuItem("Nuevo", new ImageIcon("new.png"));
JMenuItem itmAbrir = new JMenuItem("Abrir...");
JMenuItem itmGuardar = new JMenuItem("Guardar");

// Atajo de teclado
itmGuardar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
itmNuevo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));

itmNuevo.addActionListener(e -> nuevo());
itmAbrir.addActionListener(e -> abrir());
itmGuardar.addActionListener(e -> guardar());

menuArchivo.add(itmNuevo);
menuArchivo.add(itmAbrir);
menuArchivo.addSeparator(); // Línea separadora
menuArchivo.add(itmGuardar);

// Submenú
JMenu subMenuExportar = new JMenu("Exportar como...");
subMenuExportar.add(new JMenuItem("PDF"));
subMenuExportar.add(new JMenuItem("Excel"));
menuArchivo.add(subMenuExportar);

menuArchivo.addSeparator();
JMenuItem itmSalir = new JMenuItem("Salir");
itmSalir.addActionListener(e -> System.exit(0));
menuArchivo.add(itmSalir);

// CheckBox y RadioButton en menú
JCheckBoxMenuItem chkAutoguardar = new JCheckBoxMenuItem("Autoguardar", true);
JRadioButtonMenuItem rbOpcA = new JRadioButtonMenuItem("Opción A", true);
JRadioButtonMenuItem rbOpcB = new JRadioButtonMenuItem("Opción B");
ButtonGroup grupoMenu = new ButtonGroup();
grupoMenu.add(rbOpcA);
grupoMenu.add(rbOpcB);

// Menú Ver
JMenu menuVer = new JMenu("Ver");
menuVer.add(chkAutoguardar);
menuVer.add(rbOpcA);
menuVer.add(rbOpcB);

menuBar.add(menuArchivo);
menuBar.add(menuVer);

// Asignar a la ventana
ventana.setJMenuBar(menuBar);

JPopupMenu — Menú contextual

JPopupMenu popup = new JPopupMenu();
popup.add(new JMenuItem("Copiar"));
popup.add(new JMenuItem("Pegar"));
popup.addSeparator();
popup.add(new JMenuItem("Eliminar"));

// Mostrar al hacer clic derecho
componente.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
mostrarPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
mostrarPopup(e);
}
private void mostrarPopup(MouseEvent e) {
if (e.isPopupTrigger()) { // Multiplataforma (en Windows es mouseReleased)
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});

JToolBar — Barra de herramientas

JToolBar toolbar = new JToolBar("Herramientas");
toolbar.setFloatable(false); // Evitar que se pueda desprender

JButton btnNuevo = new JButton(new ImageIcon("new.png"));
btnNuevo.setToolTipText("Nuevo (Ctrl+N)");
toolbar.add(btnNuevo);

toolbar.addSeparator();

JToggleButton btnNegrita = new JToggleButton(new ImageIcon("bold.png"));
btnNegrita.setToolTipText("Negrita");
toolbar.add(btnNegrita);

// Añadir al NORTH de BorderLayout
ventana.add(toolbar, BorderLayout.NORTH);