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