<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Swing</id>
	<title>Swing - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Swing"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Swing&amp;action=history"/>
	<updated>2026-10-22T06:59:51Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Swing&amp;diff=17707&amp;oldid=prev</id>
		<title>Ricardofc: /* Modelos dunha táboa */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Swing&amp;diff=17707&amp;oldid=prev"/>
		<updated>2010-05-10T15:03:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Modelos dunha táboa&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Swing básico==&lt;br /&gt;
Java ten 2 paquetes, &amp;#039;&amp;#039;AWT (Abstract Windows Toolkit)&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039;. &amp;#039;&amp;#039;AWT&amp;#039;&amp;#039; utiliza as rutinas de ventás orixinais do SO e por tanto os efectos visuais dependen do SO. Sen embargo &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039; permite tres modos: &amp;#039;&amp;#039;&amp;quot;look and feel&amp;quot;&amp;#039;&amp;#039; de Java, a apariencia nativa do SO, ou outra apariencia. &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039; está construido por enriba de &amp;#039;&amp;#039;AWT&amp;#039;&amp;#039;, deste xeito os compoñentes &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039; van precedidos de &amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039; para distinguilos dos seus homónimos &amp;#039;&amp;#039;AWT&amp;#039;&amp;#039; (Ex.: &amp;#039;&amp;#039;JFrame&amp;#039;&amp;#039; en lugar de &amp;#039;&amp;#039;Frame&amp;#039;&amp;#039;). Para incluir os compoñentes &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039; dentro de un proxecto deberemos importar os paquetes &amp;#039;&amp;#039;java.awt.*&amp;#039;&amp;#039;, &amp;#039;&amp;#039;java.awt.event.*&amp;#039;&amp;#039; e &amp;#039;&amp;#039;javax.swing.*&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Contenedores, marcos e paneis==&lt;br /&gt;
Os contenedores son controis onde situaremos outros controis.&lt;br /&gt;
&amp;#039;&amp;#039;Frames&amp;#039;&amp;#039; son contenedores de alto nivel tales como &amp;#039;&amp;#039;JFrame, JWindow, JDialog, JApplet&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;JInternalFrame&amp;#039;&amp;#039; que interactuarán co xestor de ventás do SO.&lt;br /&gt;
Os paneis son contenedores intermedios tales como &amp;#039;&amp;#039;JPanel, JOptionPane, JScrollPane, JLayeredPane, JSplitPane&amp;#039;&amp;#039; e &amp;#039;&amp;#039;JTabbedPane&amp;#039;&amp;#039; utilízanse para organizar a composición do resto dos controis dentro da ventá.&lt;br /&gt;
&lt;br /&gt;
==JFrame e JPanel==&lt;br /&gt;
JFrame é o contenedor de alto nivel máis empregado. Engade funcionalidades básicas tales como minimizar, maximizar, pechar, o título da ventá e os bordes básicos. Algúns métodos importantes de &amp;#039;&amp;#039;JFrame&amp;#039;&amp;#039; son: &amp;#039;&amp;#039;setBounds(x,y,w,h), setLocation(x,y), setSize(w,h), setResizable(bool), setTitle(str), setVisible(bool), isResizable() e getTitle()&amp;#039;&amp;#039;. O método setDefaultCloseOperation(constante) controla a acción ao pulsar o x da ventá. Normalmente usarase a constante &amp;#039;&amp;#039;JFrame.EXIT_ON_CLOSE&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
JPanel é o panel de contido máis común. Crearemos unha instancia do panel e engadirémola ao &amp;#039;&amp;#039;JFrame&amp;#039;&amp;#039;. O método &amp;#039;&amp;#039;add()&amp;#039;&amp;#039; permitirá engadir controis ao panel. A maneira en que estes controis se engaden ao panel ven definida polo &amp;#039;&amp;#039;&amp;quot;layout manager&amp;quot;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
O seguinte exemplo crea un &amp;#039;&amp;#039;JFrame&amp;#039;&amp;#039; e engádelle un &amp;#039;&amp;#039;JPanel&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.swing.*;&lt;br /&gt;
&lt;br /&gt;
public class Frame1 extends JFrame {&lt;br /&gt;
	public Frame1() {&lt;br /&gt;
		super(&amp;quot;JFrame básico&amp;quot;); &lt;br /&gt;
		setBounds(100,100,300,100);&lt;br /&gt;
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
&lt;br /&gt;
		// Crea e un panel e asociao co frame&lt;br /&gt;
		JPanel pane = new JPanel();&lt;br /&gt;
		this.getContentPane().add(panel); &lt;br /&gt;
		&lt;br /&gt;
		// Fai visible o frame&lt;br /&gt;
		setVisible(true); &lt;br /&gt;
	}&lt;br /&gt;
	public static void main(String args[]) {&lt;br /&gt;
		new Frame1();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Caixas de diálogo simples==&lt;br /&gt;
Os dialogos son ventás con información sinxela, ou peticións de información simple que se mostran como &amp;#039;&amp;#039;popups&amp;#039;&amp;#039;. En &amp;#039;&amp;#039;Swing&amp;#039;&amp;#039; utilizaremos a clase &amp;#039;&amp;#039;JOptionPane&amp;#039;&amp;#039; onde estarán os métodos básicos de cada tipo de diálogo. A clase &amp;#039;&amp;#039;JDialog&amp;#039;&amp;#039; pode usarse para crear caixas de diálogo personalizadas xa que devolve unha ventá simple sen ningún tipo de adorno.&lt;br /&gt;
&lt;br /&gt;
Cada método &amp;#039;&amp;#039;JOptionPane&amp;#039;&amp;#039; ten un primeiro parámetro apuntando ao pai (a ventá sobre a que aparecerá o diálogo) ou null (a ventá actual). O segundo parámetro será a mensaxe ou o &amp;#039;&amp;#039;prompt&amp;#039;&amp;#039; para mostrar. &lt;br /&gt;
&lt;br /&gt;
O método &amp;#039;&amp;#039;showMessageDialog()&amp;#039;&amp;#039; ten dous parámetros opcionais co título do diálogo e o icono para mostrar. Este diálogo mostrará un só boton &amp;#039;&amp;#039;Ok&amp;#039;&amp;#039; e non se devolverá ningún tipo de dato.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
JOptionPane.showMessageDialog(null,&amp;quot;Mensaxe simple para o usuario&amp;quot;,&lt;br /&gt;
    &amp;quot;Diálogo da mensaxe&amp;quot;,JOptionPane.PLAIN_MESSAGE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O método &amp;#039;&amp;#039;showConfirmDialog()&amp;#039;&amp;#039; ten tres parámetros opcionais para establecer o título do diálogo, os botóns para mostrar e o icono. Por defecto haberá tres botóns: Si, Non e Cancelar. Os valores devoltos por este método son &amp;#039;&amp;#039;JOptionPanel.YES_OPTION&amp;#039;&amp;#039;,  &amp;#039;&amp;#039;JOptionPanel.NO_OPTION&amp;#039;&amp;#039; e  &amp;#039;&amp;#039;JOptionPanel.CANCEL_OPTION&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
int pressed = JoptionPane.showConfirmDialog(null,&amp;quot;Todo ben?&amp;quot;);&lt;br /&gt;
if (pressed==JOptionPane.YES_OPTION)&lt;br /&gt;
   {&lt;br /&gt;
   	// Acción ao pulsar si&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O método &amp;#039;&amp;#039;showInputDialog()&amp;#039;&amp;#039; ten dous parámetros opcionais para establecer o título da ventá de diálogo e o icono. Haberá dous botóns: &amp;#039;&amp;#039;Ok&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Cancelar&amp;#039;&amp;#039; para finalizar o diálogo. Calquera información que tecleemos dentro da ventá de diálogo será devolta como &amp;#039;&amp;#039;String&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
String nomeUsuario = JOptionPane.showInputDialog(null,&amp;quot;Cal é o teu nome?&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A lista de tipos de iconos que se poden mostrar (usando constantes predefinidas) son: &amp;#039;&amp;#039;ERROR_MESSAGE, INFORMATION_MESSAGE, PLAIN_MESSAGE, QUESTION_MESSAGE&amp;#039;&amp;#039;, e &amp;#039;&amp;#039;WARNING_MESSAGE&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==Etiquetas, iconos e botóns==&lt;br /&gt;
As etiquetas mostrarán texto non interactivo e normalmente usaranse para mostrar información dentro da ventá. Para crear unha etiqueta usaremos a clase &amp;#039;&amp;#039;JLabel&amp;#039;&amp;#039; pasándolle o texto a mostrar como parámetro ao seu construtor. Outro parámetro que podemos pasarlle é o tipo de aliñamento horizontal. O aliñamento vertical establecese a partires do método &amp;#039;&amp;#039;setVerticalAlignment()&amp;#039;&amp;#039;. Podemos cambiar o contido da etiqueta usando o método &amp;#039;&amp;#039;setText()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Podemos engadir iconos as etiquetas ou a calquera outro control para facelos máis vistosos. Para crear un icono usaremos a clase &amp;#039;&amp;#039;IconImage&amp;#039;&amp;#039;. Podemos usar un parámetro opcional para para controlar a posición do texto relativa ao icono.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
ImageIcon icon = new ImageIcon(&amp;quot;sorriso.gif&amp;quot;);&lt;br /&gt;
JLabel label = new JLabel(&amp;quot;Ola!&amp;quot;,icon,SwingConstants.RIGHT);&lt;br /&gt;
panel.add(label);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Os botóns utilizanse para realizar operacións a petición do usuario. Para crear botóns usaremos a clase &amp;#039;&amp;#039;Jbutton&amp;#039;&amp;#039;. Podemos desactivalos co método &amp;#039;&amp;#039;setEnabled(false)&amp;#039;&amp;#039; e comprobar se están activados co método &amp;#039;&amp;#039;isEnabled()&amp;#039;&amp;#039;. Un método bastante usado é &amp;#039;&amp;#039;setMnemonic(char)&amp;#039;&amp;#039; que permite asociar unha tecla de acceso rápido co botón. Os botón precisan dun &amp;#039;&amp;#039;ActionEvent&amp;#039;&amp;#039;(é un &amp;#039;&amp;#039;event listener&amp;#039;&amp;#039;) que indicará a acción a realizar cando se prema nel.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.swing.*;&lt;br /&gt;
public class Frame2 extends JFrame&lt;br /&gt;
{&lt;br /&gt;
	public Frame2() {&lt;br /&gt;
		super(&amp;quot;Demo de botón&amp;quot;); &lt;br /&gt;
		setBounds(100,100,300,200);&lt;br /&gt;
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
&lt;br /&gt;
		JPanel panel = new JPanel();&lt;br /&gt;
		this.getContentPane().add(panel); // Panel con FlowLayout&lt;br /&gt;
		&lt;br /&gt;
		JButton boton = new JButton(&amp;quot;Preme aquí&amp;quot;);&lt;br /&gt;
		boton.setMnemonic(&amp;#039;B&amp;#039;); // Tecla de acceso rápido ao botón&lt;br /&gt;
		&lt;br /&gt;
		panel.add(boton); &lt;br /&gt;
		&lt;br /&gt;
		boton.requestFocus();&lt;br /&gt;
&lt;br /&gt;
		setVisible(true);&lt;br /&gt;
	}&lt;br /&gt;
	public static void main(String args[]) {&lt;br /&gt;
		new Frame2();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Os botóns con dous estados (&amp;#039;&amp;#039;Toggle buttons&amp;#039;&amp;#039;) mostran botóns que son como interruptores poden estar pulsados ou non. Crearanse coa clase JToggleButton. O método &amp;#039;&amp;#039;isSelected()&amp;#039;&amp;#039; devolverá o estado do botón. Ademáis do &amp;#039;&amp;#039;ActionEvent&amp;#039;&amp;#039; tamén se dispará o &amp;#039;&amp;#039;ChangeEvent&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==Caixas de texto==&lt;br /&gt;
As caixas de texto creanse usando a clase &amp;#039;&amp;#039;JTextField&amp;#039;&amp;#039;. &amp;#039;&amp;#039;JPassWordField&amp;#039;&amp;#039; representa unha caixa de texto para introducir contrasinais (mostrará asteriscos en lugar dos caracteres tecleados). Este tipo de controis utilízanse normalmente para mostrar información.&lt;br /&gt;
&lt;br /&gt;
==Áreas de texto==&lt;br /&gt;
As áreas de texto son zonas de edición para bloques ou múltiples liñas de texto. Constrúense usando a clases JTextArea para texto simple, JEditorPane para para html, rtf e texto formatado en xeral. Os método máis útiles son getText(), setText(), append(str), insert(str,pos), replace(str, comezo, fin), setEditable(bool), setLineWrap(bool) e setWrapStyleWord(bool).&lt;br /&gt;
&lt;br /&gt;
Con frecuencia o texto dentro dunha caixa de texto excede o tamaño da propia área de texto e por tanto faise necesario incluir scrolling. Para isto utilizaremos a clase JScrollPane pasándolle ao construtor da mesma o obxecto do que desexamos utilizar scroll.&lt;br /&gt;
JTextPane edit = new JTextPane();&lt;br /&gt;
JScrollPane scroll = new JScrollPane(edit);&lt;br /&gt;
panel.add(scroll); //JPanel panel = new JPanel();&lt;br /&gt;
==Listas==&lt;br /&gt;
As listas permiten que o usuario faga unha selección entre un lista de opcións predefinidas. Poden ser deplegables ou non. Para crear unha lista usaremos a clase &amp;#039;&amp;#039;JList&amp;#039;&amp;#039;. O seu construtor recibirá como parámetro o modelo da lista. As listas constrúense normalmente usando scroll (clase &amp;#039;&amp;#039;JScrollPane&amp;#039;&amp;#039;) para permitir que o usuario vexa todos os elementos da lista.&lt;br /&gt;
&lt;br /&gt;
Os modelos de listas definen os métodos de xestión dos elementos da lista. A clase &amp;#039;&amp;#039;DefaultListModel&amp;#039;&amp;#039; contén o construtor &amp;#039;&amp;#039;DefaultListModel(array)&amp;#039;&amp;#039; e os seguintes métodos de xestión: &amp;#039;&amp;#039;addElemento(nomObx), elementAt(index), removeElement(nomObx), removeAllElements(), removeElementAt(index), contains(momObx), indexOf(nome), size()&amp;#039;&amp;#039; e un método de conversión dos elementos da lista nun array &amp;#039;&amp;#039;copyInto(array)&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;#039;&amp;#039;getSelectedValue()&amp;#039;&amp;#039; devolve o elemento seleccionado ou &amp;#039;&amp;#039;getSelectedIndex()&amp;#039;&amp;#039; devolve o número de índice do elemento seleccionado. Para permitir selección múltiple utilízase o método &amp;#039;&amp;#039;setSelectionMode(2)&amp;#039;&amp;#039;. A selección por defecto pode establecerse co método &amp;#039;&amp;#039;setSelectedIndex(x)&amp;#039;&amp;#039;. Cando permitimos selección múltiple podemos obter un array cos elementos seleccionados usando o método &amp;#039;&amp;#039;getSelectedValues()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Os listas desplegables son un tipo especial de lista que crearemos usando a clase &amp;#039;&amp;#039;JComboBox&amp;#039;&amp;#039;. O método &amp;#039;&amp;#039;setEditable(true)&amp;#039;&amp;#039; fai os elementos do combo editables. O elemento seleccionado obtense cos métodos &amp;#039;&amp;#039;getSelectedItem()&amp;#039;&amp;#039; e &amp;#039;&amp;#039;getSelectedIndex()&amp;#039;&amp;#039;. Outros métodos útiles serán &amp;#039;&amp;#039;getItemAt(idx), getItemCount(), setSelectedItem(obx)&amp;#039;&amp;#039; e &amp;#039;&amp;#039;setMaximunRowCount(x)&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Táboas ==&lt;br /&gt;
As táboas representan unha das formas máis comúns de amosar un conxunto de datos relacionais, coma por exemplo os rexistros dunha base de datos. &amp;lt;br /&amp;gt;&lt;br /&gt;
Java incorpora unha clase de nome &amp;#039;&amp;#039;&amp;#039;JTable&amp;#039;&amp;#039;&amp;#039; no paquete &amp;#039;&amp;#039;&amp;#039;javax.swing&amp;#039;&amp;#039;&amp;#039; para permitir o acceso a un compoñente que poida manipular calquera tipo de táboa.&amp;lt;br /&amp;gt;&lt;br /&gt;
Para engadir unha táboa a un contenedor seguimos os pasos acostumados para engadir calquera compoñente a un contenedor:&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Construimos o obxecto &amp;#039;&amp;#039;&amp;#039;JTable&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Establecemos as súas propiedades&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Engadímolo ao contenedor, normalmente un formulario(marco JFrame) ou un panel (JPanel).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
As táboas están compostas por filas e columnas e representan os datos en celdas, sendo unha celda a rexión formada pola intersección dunha fila e unha columna. Nas táboas poden existir 2 tipos de filas e columnas: editables e non editables. Ás veces o número de filas e columnas é superior á superficie da táboa co cal é necesario empregar barras de desprazamento nun panel de desprazamento (JScrollPane) para poder visualizar o contido de todas as filas e todas as columnas. É interesante saber que a barra de desprazamento horizontal soamente aparece se a propiedade &amp;#039;&amp;#039;autoResizeMode&amp;#039;&amp;#039; toma valor &amp;#039;&amp;#039;OFF&amp;#039;&amp;#039;: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
obxecto_jtable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== O constructor dunha táboa ===&lt;br /&gt;
Existen varios constructores da clase JTable, un moi empregado é o que posúe 2 argumentos: un de tipo Object[][] que permite almacenar nunha matriz bidimensional as filas e columnas que amosará a táboa e outro de tipo String[] que permite almacenar nunha matriz unidimensional as cabeceiras das columnas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Declaración de variables&lt;br /&gt;
&lt;br /&gt;
//Campo taboa1 tipo JTable&lt;br /&gt;
private javax.swing.JTable taboa1;&lt;br /&gt;
&lt;br /&gt;
//Datos para a táboa nunha matriz bidimensional&lt;br /&gt;
Object[][] datos = {&lt;br /&gt;
        {&amp;quot;Xan&amp;quot;, &amp;quot;22&amp;quot;, new Long(11111111), new Boolean(true)} ,&lt;br /&gt;
        {&amp;quot;Pia&amp;quot;, &amp;quot;32&amp;quot;, new Long(12111111), new Boolean(true)} ,&lt;br /&gt;
        {&amp;quot;Xurxo&amp;quot;, &amp;quot;27&amp;quot;, new Long(13111111), new Boolean(false)} &lt;br /&gt;
} ;&lt;br /&gt;
&lt;br /&gt;
//Cabeceiras da táboa nunha matriz unidimensional&lt;br /&gt;
String[] cabeceiras = { &amp;quot;Nome&amp;quot;, &amp;quot;Idade&amp;quot;, &amp;quot;Teléfono&amp;quot;, &amp;quot;Casado&amp;quot; } ;&lt;br /&gt;
&lt;br /&gt;
//Constructor da táboa&lt;br /&gt;
taboa1 = new javax.swing.JTable (datos, cabeceiras) ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Barras de desprazamento nunha táboa ===&lt;br /&gt;
Para engadir barras de desprazamento a unha táboa empregamos un panel de desprazamento &amp;#039;&amp;#039;&amp;#039;JScrollPane&amp;#039;&amp;#039;&amp;#039;. Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Declaración de variables&lt;br /&gt;
&lt;br /&gt;
//Creación do panel de desprazamento jscrollpane1 do tipo JScrollPane&lt;br /&gt;
private javax.swing.JScrollPane jscrollpane1 ;&lt;br /&gt;
&lt;br /&gt;
//Campo taboa1 tipo JTable&lt;br /&gt;
private javax.swing.JTable taboa1;&lt;br /&gt;
&lt;br /&gt;
//Engadir na táboa taboa1 as barras de desprazamento do panel de desprazamento jscrollpane1&lt;br /&gt;
jscrollpane1 = new javax.swing.JScrollPane(taboa1) ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Modelos dunha táboa ===&lt;br /&gt;
Unha táboa posúe os seguintes modelos:&lt;br /&gt;
&amp;lt;ul style=&amp;quot;text-align: justify&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;TableModel&amp;#039;&amp;#039;&amp;#039;: Modelo que dá información de filas, columnas e celdas. &amp;#039;&amp;#039;&amp;#039;JFC&amp;#039;&amp;#039;&amp;#039; proporciona unha implementación estándar da interface &amp;#039;&amp;#039;&amp;#039;TableModel&amp;#039;&amp;#039;&amp;#039; baixo a clase &amp;#039;&amp;#039;&amp;#039;DefaultTableModel&amp;#039;&amp;#039;&amp;#039; derivada de &amp;#039;&amp;#039;&amp;#039;AbstractTableModel&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;TableColumnModel&amp;#039;&amp;#039;&amp;#039;: Modelo para almacenar varias columnas como unha colección. &amp;#039;&amp;#039;&amp;#039;JFC&amp;#039;&amp;#039;&amp;#039; proporciona unha implementación estándar da interface &amp;#039;&amp;#039;&amp;#039;TableColumnModel&amp;#039;&amp;#039;&amp;#039; baixo a clase &amp;#039;&amp;#039;&amp;#039;DefaultTableColumnModel&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Unha táboa implementa por omisión un modelo, isto é,  a súa propiedade &amp;#039;&amp;#039;model&amp;#039;&amp;#039; fai referencia a un obxecto da clase &amp;#039;&amp;#039;&amp;#039;DefaultTableModel&amp;#039;&amp;#039;&amp;#039;, implementación estándar da interface &amp;#039;&amp;#039;&amp;#039;TableModel&amp;#039;&amp;#039;&amp;#039; e derivada de &amp;#039;&amp;#039;&amp;#039;AbstractTableModel&amp;#039;&amp;#039;&amp;#039;, que contén os datos da táboa. A propiedade &amp;#039;&amp;#039;model&amp;#039;&amp;#039; sería posible modificala en calquera momento mediante o método &amp;#039;&amp;#039;&amp;#039;setModel&amp;#039;&amp;#039;&amp;#039;. Así poderiamos modificar o código dos apartados anteriores do seguinte xeito:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jscrollpane1 = new javax.swing.JScrollPane() ;&lt;br /&gt;
taboa1 = new javax.swing.JTable() ;&lt;br /&gt;
&lt;br /&gt;
taboa1.setModel(new javax.swing.table.DefaultTableModel(datos, cabeceiras));&lt;br /&gt;
jscrollpane1.setViewportView(taboa1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Agora temos asignado ao obxecto &amp;#039;&amp;#039;taboa1&amp;#039;&amp;#039; o modelo por defecto &amp;#039;&amp;#039;&amp;#039;DefaultTableModel&amp;#039;&amp;#039;&amp;#039;, co cal por empregar o modelo por defecto unha táboa terá as seguintes características:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As celdas son todas editables&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Os datos son todos de tipo String, isto é, dá igual como foran declarados (int, boolean...) a táboa amosaraos como un String; así por exemplo non aparecerá nunha unha casilla de verificación senón o string true ou false.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Para evitar istas restriccións hai que crear un modelo propio creando unha clase que herde de &amp;#039;&amp;#039;&amp;#039;DefaulTableModel&amp;#039;&amp;#039;&amp;#039; ou de &amp;#039;&amp;#039;&amp;#039;AbstractTableModel&amp;#039;&amp;#039;&amp;#039; e redifinir os métodos necesarios.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes atopar máis información sobre modelos de táboas na seguinte ligazón: [https://informatica.iessanclemente.net/manuais/index.php/A_Clase_AbstractTableModel:_Crear_t%C3%A1boas_personalizadas_para_interfaces_de_usuario_en_Swing Taboas personalizadas para interfaces de usuario en Swing]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; &lt;br /&gt;
--ricardofc [10/05/10]&lt;br /&gt;
&lt;br /&gt;
==Modelo de eventos swing==&lt;br /&gt;
Os GUIs son conducidos por eventos; isto significa que responden en distintos xeitos aos distintos eventos que se producen ao longo da súa vida. A maior parte dos eventos son xenerados polo propio usuario.&lt;br /&gt;
No modelo de eventos hai tres participantes:&lt;br /&gt;
*Orixe do evento&lt;br /&gt;
*Obxecto do evento&lt;br /&gt;
*Listener do evento&lt;br /&gt;
A orixe do evento é obxecto que cambia o seu estado e que xenera o evento (por exemplo cando se preme pon unha marca nunha casilla de verificación). O obxecto do evento encapsula o cambio producido no obxecto orixe do evento. O &amp;#039;&amp;#039;listener&amp;#039;&amp;#039; é o obxecto que quere ser notificado da ocurrencia de ese evento concreto, así o oxecto orixe do evento delega a tarefa de manexar o evento (realizar a acción oportuna) sobre o &amp;#039;&amp;#039;listener&amp;#039;&amp;#039;. Isto coñécese como o modelo de delegación de eventos de Java.&lt;br /&gt;
A seguinte táboa mostra unha lista cos listeners(son interfaces) máis usuais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;background:#ffdead;&amp;quot; |  Interface&lt;br /&gt;
! style=&amp;quot;background:#ffdead;&amp;quot; |  Método&lt;br /&gt;
! style=&amp;quot;background:#ffdead;&amp;quot; |  Exemplo&lt;br /&gt;
|-&lt;br /&gt;
| ActionListener&lt;br /&gt;
| actionPerformed()&lt;br /&gt;
| Click en botóns&lt;br /&gt;
|-&lt;br /&gt;
| AdjustmentListener&lt;br /&gt;
| adjustmentValueChanged()&lt;br /&gt;
| Facer scroll&lt;br /&gt;
|-&lt;br /&gt;
| ChangeListener&lt;br /&gt;
| stateChanged()&lt;br /&gt;
| Mover un &amp;#039;&amp;#039;slider&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| ComponentListener&lt;br /&gt;
| componentResized() etc.&lt;br /&gt;
| Mover, cambiar tamaño, ocultar ou mostrar&lt;br /&gt;
|-&lt;br /&gt;
| ContainerListener&lt;br /&gt;
| componentAdded(), componentRemoved()&lt;br /&gt;
| Engadimos/quitamos un compoñente&lt;br /&gt;
|-&lt;br /&gt;
| FocusListener&lt;br /&gt;
| focusGained(), focusLost()&lt;br /&gt;
| Un cambo de texto gaña/perde foco&lt;br /&gt;
|-&lt;br /&gt;
| ItemListener&lt;br /&gt;
| itemStateChanged()&lt;br /&gt;
| Cambios nunha &amp;#039;&amp;#039;checkbox&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| KeyListener&lt;br /&gt;
| keyPressed(), keyReleased(), keyTyped()&lt;br /&gt;
| Texto dende o teclado&lt;br /&gt;
|-&lt;br /&gt;
| MouseListener&lt;br /&gt;
| mouseClicked() etc.&lt;br /&gt;
| Click do rato&lt;br /&gt;
|-&lt;br /&gt;
| MouseMotionListener&lt;br /&gt;
| mouseDragged(), mouseMoved()&lt;br /&gt;
| Todos os movementos do rato&lt;br /&gt;
|-&lt;br /&gt;
| TextListener&lt;br /&gt;
| textValueChanged()&lt;br /&gt;
| O contido dun texto cambia&lt;br /&gt;
|-&lt;br /&gt;
| WindowListener&lt;br /&gt;
| windowActivated() etc.&lt;br /&gt;
| Pechar unha ventana&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface&lt;br /&gt;
Método&lt;br /&gt;
Exemplo&lt;br /&gt;
ActionListener&lt;br /&gt;
actionPerformed()&lt;br /&gt;
Click en botóns&lt;br /&gt;
AdjustmentListener&lt;br /&gt;
adjustmentValueChanged()&lt;br /&gt;
Facer scroll&lt;br /&gt;
ChangeListener&lt;br /&gt;
stateChanged()&lt;br /&gt;
Mover un &amp;#039;slider&amp;#039;&lt;br /&gt;
ComponentListener&lt;br /&gt;
componentResized() etc.&lt;br /&gt;
Mover, cambiar tamaño, ocultar ou mostrar&lt;br /&gt;
ContainerListener&lt;br /&gt;
componentAdded()&lt;br /&gt;
componentRemoved()&lt;br /&gt;
Engadimos/quitamos un compoñente&lt;br /&gt;
FocusListener&lt;br /&gt;
focusGained()&lt;br /&gt;
focusLost()&lt;br /&gt;
Un cambo de texto gaña/perde foco&lt;br /&gt;
ItemListener&lt;br /&gt;
itemStateChanged()&lt;br /&gt;
Cambios nunha checkbox&lt;br /&gt;
KeyListener&lt;br /&gt;
keyPressed()&lt;br /&gt;
keyReleased()&lt;br /&gt;
keyTyped()&lt;br /&gt;
Texto dende o teclado&lt;br /&gt;
MouseListener&lt;br /&gt;
mouseClicked() etc.&lt;br /&gt;
Click do rato&lt;br /&gt;
MouseMotionListener&lt;br /&gt;
mouseDragged()&lt;br /&gt;
mouseMoved()&lt;br /&gt;
Todos os movementos do rato&lt;br /&gt;
TextListener&lt;br /&gt;
textValueChanged()&lt;br /&gt;
O contido dun texto cambia&lt;br /&gt;
WindowListener&lt;br /&gt;
windowActivated() etc.&lt;br /&gt;
Pechar unha ventana&lt;br /&gt;
&lt;br /&gt;
Cando algo pasa dentro da aplicación créase un obxecto evento. Por exemplo, cando facemos click nun botón ou seleccionamos un elemento de unha lista. Existen moitos tipos de eventos (&amp;#039;&amp;#039;ActionEvent, TextEvent, FocusEvent, ComponetEvent&amp;#039;&amp;#039;, etc), cada un deles creado baixo determinadas condicións.&lt;br /&gt;
Examina o seguinte exemplo para ver o funcionamento dos eventos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
&lt;br /&gt;
import java.text.DateFormat;&lt;br /&gt;
&lt;br /&gt;
import java.util.Calendar;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import java.util.Locale;&lt;br /&gt;
&lt;br /&gt;
import javax.swing.DefaultListModel;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JList;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
&lt;br /&gt;
public class EventObject extends JFrame {&lt;br /&gt;
&lt;br /&gt;
    private JList list;&lt;br /&gt;
    private DefaultListModel model;&lt;br /&gt;
&lt;br /&gt;
    public EventObject() {&lt;br /&gt;
&lt;br /&gt;
        setTitle(&amp;quot;Obxecto evento&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        JPanel panel = new JPanel();&lt;br /&gt;
        panel.setLayout(null);&lt;br /&gt;
&lt;br /&gt;
        model = new DefaultListModel();&lt;br /&gt;
        list = new JList(model);&lt;br /&gt;
        list.setBounds(150, 30, 220, 150);&lt;br /&gt;
&lt;br /&gt;
        JButton ok = new JButton(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
        ok.setBounds(30, 35, 80, 25);&lt;br /&gt;
&lt;br /&gt;
        ok.addActionListener(new ActionListener() {&lt;br /&gt;
            public void actionPerformed(ActionEvent event) {&lt;br /&gt;
&lt;br /&gt;
                Calendar cal = Calendar.getInstance();&lt;br /&gt;
                cal.setTimeInMillis(event.getWhen());&lt;br /&gt;
                Locale locale = Locale.getDefault();&lt;br /&gt;
                Date date = new Date();&lt;br /&gt;
                String s = DateFormat.getTimeInstance(DateFormat.SHORT,&lt;br /&gt;
                    locale).format(date);&lt;br /&gt;
&lt;br /&gt;
                if ( !model.isEmpty() )&lt;br /&gt;
                    model.clear();&lt;br /&gt;
&lt;br /&gt;
                if (event.getID() == ActionEvent.ACTION_PERFORMED)&lt;br /&gt;
                    model.addElement(&amp;quot; Event Id: ACTION_PERFORMED&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                model.addElement(&amp;quot; Hora: &amp;quot; + s);&lt;br /&gt;
&lt;br /&gt;
                String source = event.getSource().getClass().getName();&lt;br /&gt;
                model.addElement(&amp;quot; Fonte: &amp;quot; + source);&lt;br /&gt;
&lt;br /&gt;
                int mod = event.getModifiers();&lt;br /&gt;
&lt;br /&gt;
                StringBuffer buffer = new StringBuffer(&amp;quot; Modificadores: &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                if ((mod &amp;amp; ActionEvent.ALT_MASK) &amp;gt; 0)&lt;br /&gt;
                    buffer.append(&amp;quot;Alt &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                if ((mod &amp;amp; ActionEvent.SHIFT_MASK) &amp;gt; 0)&lt;br /&gt;
                    buffer.append(&amp;quot;Shift &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                if ((mod &amp;amp; ActionEvent.META_MASK) &amp;gt; 0)&lt;br /&gt;
                    buffer.append(&amp;quot;Meta &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                if ((mod &amp;amp; ActionEvent.CTRL_MASK) &amp;gt; 0)&lt;br /&gt;
                    buffer.append(&amp;quot;Ctrl &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                model.addElement(buffer);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        panel.add(ok);&lt;br /&gt;
        panel.add(list);&lt;br /&gt;
        add(panel);&lt;br /&gt;
&lt;br /&gt;
        setSize(420, 250);&lt;br /&gt;
        setLocationRelativeTo(null);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        new EventObject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O anterior código mostra un botón e unha lista. Ó pulsar o botón móstrase na lista a información acerca do evento. Neste caso utilizamos o clase &amp;#039;&amp;#039;ActionEvent&amp;#039;&amp;#039; para capturar o evento clicar nun botón.&lt;/div&gt;</summary>
		<author><name>Ricardofc</name></author>
	</entry>
</feed>