Red de conocimiento informático - Material del sitio web - Cómo crear una tabla con una aplicación java

Cómo crear una tabla con una aplicación java

Algo problemático

Se recomienda no utilizar Java para implementarlo

Componente JTable:

Diagrama de jerarquía de clases:

java.lang.Object

--java.awt.Component

--java.awt.Container

--javax.swing. JComponent

--javax.swing.JTabel

Antes de usar JTable, echemos un vistazo a sus constructores y cómo usarlos:

JTabel Constructor:

JTable(): crea un nuevo JTables y usa el modelo predeterminado del sistema.

JTable(int numRows, int numColumns): crea una fila con numRows, numColumns Tabla vacía de columnas, <. /p>

Se utiliza DefaultTableModel

JTable(Object[ ][ ] rowData,Object[ ][ ] columnNames): crea una tabla que muestra datos de matriz bidimensional, y puede

mostrar nombres de columnas.

JTable (TableModeldm): crea una JTable con el modo de campo y el modo de selección predeterminados, y establece el modo de datos.

JTable(TableModeldm,TableColumnModel cm): crea una JTable, establece el modo de datos y el modo de campo, y

tiene un modo de selección predeterminado.

JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm): crea una JTable y establece el modo de datos, el modo de campo y el modo de selección.

JTable(Vector rowData,Vector columnNames): crea una tabla de datos con Vector como fuente de entrada, que puede mostrar

los nombres de las filas.

Primero usamos el método de construcción Array para explicar cómo usar JTable para crear una tabla simple:

import javax.swing.*

import java. awt .*;

importar java.awt.event.*;

importar java.util.*

clase pública SimpleTable{

public SimpleTable(){

JFrame f=new JFrame();

Objeto[ ][ ] playerInfo={

{" Tonto",nuevo Entero (66), nuevo Entero (32), nuevo Entero (98), nuevo

Booleano(falso)},

{"tonto",nuevo Entero(82), nuevo Entero (69), nuevo Entero (128), nuevo

Booleano(verdadero)},

};

Cadena[ ] Nombres={"Nombre" , "Chino","Matemáticas","Puntuación total","Aprobado"};

JTable table=new JTable(playerInfo,Names

table.setPreferredScrollableViewportSize(new Dimension); ( 550,30));

JScrollPane scrollPane=new JScrollPane(table);

f.getContentPane().add(scrollPane,BorderLayout.CENTER); p > f.setTitle("SimpleTable");

f.pack();

f.show()

f.addWindowListener(newWindowAdapter( ) {

ventana vacía públicaClosing(WindowEvent e) {

System.exit(0);

}

}); /p>

p>

}

public static void main(String[] args){

SimpleTable b=new SimpleTable(); p> }

}

La tabla consta de dos partes: el encabezado de fila (encabezado de columna) y el objeto de fila (objeto de columna). Utilice getTableHead proporcionado por JTable

El método er() obtiene el título de la fila. En este ejemplo, colocamos JTable en JScrollPane

. Este enfoque puede mostrar completamente el encabezado de columna y el objeto Colmn, porque JScrollPane obtendrá automáticamente el encabezado de columna. línea de arriba y modifique la línea 16:

f.getContentPane().add(table,BorderLayout.CENTER);

El resultado de la ejecución es usted. Encontrará que el encabezado de columna es desaparecido.

Si no deseas utilizar JScrollPane, para solucionar este problema, debes modificar el programa de la siguiente manera:

JTable table=new JTable(p,n

table.setPreferredScrollableViewportSize(new Dimension(550,30));

f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH

f.getContentPane( ).add(table,BorderLayout.CENTER);

El resultado de ejecución tendrá títulos de fila como antes

El resultado de ejecución anterior mostrará que cada campo. Los anchos son todos iguales a menos que arrastre un determinado ancho de columna.

Si

queremos establecer el valor del ancho de la columna desde el principio, podemos usar

el método setPreferredWidth() proporcionado por la clase TableColumn para configurarlo, y podemos usar el

El método setAutoResizeMode() se utiliza para establecer el cambio de otros anchos de columna al ajustar el ancho de una determinada columna

. Veamos el siguiente ejemplo:

importar javax.swing.*;

importar javax.swing.table.*;

importar java.awt.*; event.*;

importar java.awt.*; p>

importar java.util.*

clase pública SimpleTable2{

pública SimpleTable2 (){

JFrame f=new JFrame();

Objeto[][] p={

{" Tonto",nuevo entero(66) ,nuevo entero(32),nuevo entero(98),nuevo

booleano(falso),nuevo booleano(falso)},

{" tonto",nuevo entero(82) ,nuevo entero(69),nuevo entero(128),nuevo

Booleano(verdadero),nuevo booleano(falso)},

}

Cadena [] n={"Nombre","Chino","Matemáticas","Puntuación total","aprobado","trampa"};

TableColumn column=null

JTable table=new JTable(p,n);

table.setPreferredScrollableViewportSize(new Dimension(550,30));

table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS

for (int i=0;i<6;i++){

//Utilice el método getColumnModel() en JTable para obtener el objeto TableColumnModel y luego utilice el método getColumn() definido en; la interfaz

TableColumnModel para obtener el

//objeto TableColumn, puede controlar el ancho del campo utilizando el método setPreferredWidth() de este objeto

column=table.getColumnModel().getColumn(i);

if ((i%2 )==0)

column.setPreferredWidth(150);

más

columna

.setPreferredWidth(50);

}

JScrollPane scrollPane=new JScrollPane(tabla);

f.getContentPane().add(scrollPane,BorderLayout.CENTER

f.setTitle("SimpleTable");

f.pack()

f.show(); > f.setVisible(true);

f.addWindowListener(newWindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0

}

});

}

público estático vacío principal (String[] args){

new SimpleTable2();

}

}

Cinco parámetros que la columna puede ajustar:

AUTO_RESIZE_SUBSEQUENT_COLUMENS: cuando se ajusta Cuando una determinada columna es ancha, el ancho de todas las columnas de campo después de este campo

cambiará al mismo tiempo. Este es el valor predeterminado del sistema.

AUTO_RESIZE_ALL_COLUMNS: cuando se ajusta el ancho de una determinada columna, los anchos de columna de todos los campos de esta tabla cambiarán juntos

.

AUTO_RESIZE_OFF: al ajustar el ancho de una determinada columna, el ancho de columna de todos los campos de esta tabla no cambiará en consecuencia.

AUTO_RESIZE_NEXT_COLUMN: al ajustar el ancho de una determinada columna, el ancho de la columna del siguiente campo en este campo cambiará en consecuencia.

El resto no cambiará.

AUTO_RESIZE_LAST_COLUMN: al ajustar un determinado ancho de columna, el ancho de columna del último campo cambiará en consecuencia y el resto

no cambiará.

Como se puede ver en los ejemplos anteriores, en realidad es muy sencillo usar Swing para construir una tabla siempre que utilice Vector o Array

como entrada de datos de nuestro. tabla, reemplace el Vector o Array

El contenido se completa en JTable y se genera una tabla básica. Sin embargo, aunque usar los constructores JTable(Object[][]

rowData,Object[][] columnNames) y

JTable(Vector rowData,Vector columnNames) para construir una JTable es muy conveniente, pero tiene algunas deficiencias

. Por ejemplo, en el ejemplo anterior, cada campo de nuestra tabla

(celda) se puede modificar de forma predeterminada al principio, por lo que los usuarios pueden modificar nuestros datos en segundo lugar, cada celda de la tabla

<; p> Los tipos de datos en p>

(celda) se tratarán como del mismo tipo.

En nuestro

ejemplo, todos los tipos de datos se muestran como tipos de cadena. Por lo tanto, el tipo de datos original declarado como booleano

aparecerá en forma de cadena en lugar de aparecer como. casilla de verificación (

Casilla de verificación).

Además, si los datos que queremos mostrar no son fijos, o cambian con la situación, por ejemplo, también es un formulario de informe

Lo que ven profesores y alumnos Las tablas que reciba no será el mismo y la apariencia mostrada o el modo de operación también pueden ser diferentes. Para hacer frente a estas diversas situaciones complejas, el método de construcción simple anterior ya no es adecuado. Swing proporciona varios modelos (como:

TableModel, TableColumnModel y ListSelectionModel) para resolver los inconvenientes anteriores, para aumentar. la flexibilidad del diseño de nuestras mesas

. Primero presentemos TableModel

:

TableModel

La clase TableModel en sí es una interfaz y en esta interfaz se definen varios métodos: incluido Proporciona operaciones de acceso básicas como acceder al contenido de los campos de la tabla (celdas), calcular el número de columnas en las tablas, etc., para que los diseñadores puedan simplemente usar

TableModel para implementarlos en la forma que deseen. La interfaz TableModel se encuentra en el paquete javax.swing.table.

Este paquete define muchos modelos diferentes utilizados por JTable. Los lectores pueden usar el archivo API de Java para encontrar este paquete. y busque los métodos definidos por varios tipos o interfaces de este paquete.

Método TableModel:

void addTableModelListener(TableModelListener l): Le da a la tabla la capacidad de manejar TableModelEvent

.

Cuando el modelo de tabla de la tabla cambia, se emitirá la información del evento TableModel Event

Class getColumnClass(int columnIndex): devuelve el nombre de clase del tipo de datos del campo

int. getColumnCount(): Devuelve el número de campos (filas).

String getColumnName(int columnIndex): Devuelve el nombre del campo

int getRowCount(): Devuelve el número de columnas de datos.

Objeto getValueAt(int rowIndex, int columnIndex): Devuelve el valor en una determinada celda de los datos.

boolean isCellEditable(int rowIndex, int columnIndex): Devuelve si la celda. es editable, si es verdadero

es editable

void removeTableModelListener(TableModelListener l): elimina un oyente de TableModelListener

void setValueAt. (Object aValue,int rowIndex, int columnIndex): establece el valor de una determinada

celda(rowIndex, columnIndex

Dado que TableModel en sí es una interfaz, no es necesario Implemente directamente esta interfaz para crear una tabla. Fácil

Afortunadamente, Java proporciona dos clases para implementar esta interfaz respectivamente, una es la clase abstracta AbstractTableModel y la otra es

DefaultTableModel. clase de entidad. El primero implementa la mayor parte del método TableModel, que permite a los usuarios construir de manera flexible sus propios modos de tabla; el segundo hereda la clase anterior y es el modo de tabla predeterminado de Java. La relación entre los tres es la siguiente:

TableModel---implements--->AbstractTableModel-----extends--->DefaultTableModel

AbstractTableModel:

AbstractTableModel proporcionado por Java es una clase abstracta, esta La clase nos ayuda a implementar la mayoría de los métodos TableModel

excepto los tres métodos getRowCount(), getColumnCount() y getValueAt(). Por lo tanto, nuestra tarea principal es

. para implementar estos tres métodos. Usando esta clase abstracta, puede diseñar tablas en diferentes formatos. Echemos un vistazo a los métodos que proporciona:

Método AbstractTableModel:

p>void addTableModelListener(TableModelListener l): hace que la tabla sea capaz de procesar TableModelEvent

Cuando el modelo de tabla de la tabla cambia, se emitirá

Información del evento TableModelEvent

int findColumn(String columnName): busca si el elemento columnName está incluido en el nombre de la fila. Si

lo hay, devuelve la posición de la fila; return -1 significa

void fireTableCellUpdated(int fila, int columna): notifica a todos los oyentes que el contenido del

campo (fila, columna) en esta tabla ha cambiado

. p> p>

void fireTableChanged(TableModelEvent e): envía la notificación del evento recibido a todos los TableModelListeners registrados en esta tabla

modelo

void fireTableDataChanged(): notifica a todos los oyentes. que el contenido de las columnas de esta tabla ha cambiado. El

número de columnas puede haber cambiado, por lo que es posible que JTable necesite volver a mostrar la estructura de esta tabla

void fireTableRowsDeleted (int. firstRow, int lastRow): Notifica a todos los oyentes que las filas

de la primera a la última fila en esta tabla se han eliminado

void fireTableRowsUpdated(int firstRow, int lastRow): Notifica a todos los oyentes que filas.

las filas de la primera a la última fila de esta tabla se han modificado.

void fireTableRowsInserted(int firstRow, int lastRow):Notifica a todos los oyentes que las filas

de la primera a la última fila tienen. se han modificado en esta tabla. Se han agregado las

primera fila a la última fila de columnas

void fireTableStructureChanged(): notifica a todos los oyentes que la estructura. de esta tabla ha cambiado El número de filas

El número, el nombre y el tipo de datos pueden haber cambiado

Clase getColumnClass(int columnIndex): Devuelve el. tipo de datos de campo Nombre de clase.

Cadena getColumnName(columna int): si el título de la columna no está establecido, se devuelve el valor predeterminado, en orden:

A,B,C, ...Z,AA,AB ,..;Si no existe dicha columna, se devolverá una cadena vacía

Public EventListener[] getListeners(Class listeningerType): Devuelve todo el

El oyente en el oyente coincide con el tipo de oyente y se devuelve en forma de matriz

boolean isCellEditable(int rowIndex, int columnIndex): Devuelve. todos los objetos en este modelo de tabla

Los oyentes en los

escuchas creados que coinciden con el formato listeningerType se devuelven en forma de matriz

voidremoveTableModelListener(TableModelListener l): elimina un

escucha de TableModelListener.

voidsetValueAt(Object aValue, int rowIndex, int columnIndex)

: establece el valor de una determinada celda (rowIndex, columnIndex). Cuidadosamente Puede encontrar que los métodos definidos por TableModel son diferentes de los métodos proporcionados por AbstractTableModel anteriormente

Descubra que la clase abstracta AbstractTableModel no implementa

getRowCount(), getColumnCount(). , getValueAt(). Tres métodos, por lo que tenemos que implementar estos

tres métodos. Veamos cómo usar

AbstractTableModel para implementar el modo de tabla que queremos. >

Ejemplo:TableModel1.java

importar javax.swing.table.AbstractTableModel

importar javax.swing.*

importar java.awt .*;

importar java.awt.event.*;

public classTableModel1{

publicTableModel1() {

JFrame f = nuevo JFrame();

MyTable mt=new MyTable();

JTable t=new JTable(mt);

t.setPreferredScrollableViewportSize( nueva Dimensión( 550, 30));

JScrollPane s = nuevo JScrollPane(t);

f.getContentPane().add(s, BorderLayout.CENTER); > f.setTitle("JTable1");

f.pack();

f.setVisible(true);

f.addWindowListener (newWindowAdapter( ) {

ventana vacía públicaClosing(WindowEvent e) {

System.exit(0);

}

} ); /p>

}

public static void main(String args[]) {

newTableModel1()

}

}

clase MiTabla extender

sAbstractTableModel{

Objeto[][] p = {

{"tonto", nuevo entero(66),

nuevo entero(32), nuevo entero (98), nuevo booleano(falso),nuevo booleano(falso)},

{"Agua", nuevo entero(85),

nuevo entero(69), nuevo entero (154), nuevo booleano(verdadero),nuevo booleano(falso)},

}

Cadena[] n = {"Nombre",

; "Chino",

"Matemáticas",

"Puntuación total",

"Aprobar",

"Hacer trampa"};

public int getColumnCount() {

return n.length

}

public int getRowCount() {

return p.length;

}

public String getColumnName(int col) {

return n[col]; > }

objeto público getValueAt(int fila, int col) {

return p[fila][col]

}

< p; > clase pública getColumnClass(int c) {

return getValueAt(0, c).getClass()

}

}

< p; >En el ejemplo anterior, ya sea que el tipo de datos en la tabla sea String, int o Boolean, todos se muestran como cadena

Por ejemplo, en un campo calificado, los datos originales son booleanos

el tipo está representado, pero cuando se muestra en JTable, se convierte en forma de cadena. Si queremos que la tabla muestre diferentes tipos de datos

, debemos escribir Override en MyTable getColumnCl

método ass(), este método nos permite identificar el tipo de datos de cada fila en la tabla y mostrar este tipo apropiadamente:

public Class getColumnClass(int c ) {

return getValueAt(0, c).getClass();

}

De esta manera, "hacer trampa" se mostrará como una casilla de verificación y el tipo de datos siempre será depende de Se muestra a la derecha, los tipos de cadena siempre se muestran a la izquierda

TableModel2.

.java

importar javax.swing.table.AbstractTableModel

importar javax.swing.*

importar java.awt.*;

importar java.awt.event.*;

public classTableModel2 implementsActionListener{

JTable t = null

publicTableModel2() {

JFrame f = new JFrame("DataModel");

JButton b1 = new JButton("Profesor de Matemáticas");

b1.addActionListener(this); >

JButton b2 = nuevo JButton("Estudiante tonto");

b2.addActionListener(this);

Panel JPanel = nuevo JPanel(); p> panel.add(b1);

panel.add(b2);

t=new JTable(new MyTable(1)); .setPreferredScrollableViewportSize(nueva Dimensión(550, 30));

JScrollPane s = nuevo JScrollPane(t);

f.getContentPane().add(panel, BorderLayout.NORTH);

f.getContentPane().add(s, BorderLayout.CENTER);

f.pack();

f.setVisible(true); /p>

f.addWindowListener(newWindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

acción nula pública realizada (ActionEvent e)

{

if ( e.getActionCommand().equals("Estudiante tonto"))

t.setModel(new MyTable(1));

if (e.getActionCommand().equals(" Profesor de matemáticas"))

t.setModel(new MyTable(2));

t.revalidate();

}

pu

blic static void main(String args[]) {

newTableModel2();

}

}

class MyTable extendsAbstractTableModel{

Objeto[][] p1 = {

{"Tonto", "1234", nuevo Integer(66),

nuevo Integer(50), nuevo Entero(116), nuevo booleano(falso),nuevo booleano(falso)}};

Cadena[] n1 = {"Nombre","ID de estudiante","Chino","Matemáticas"," Puntuación total","pasar","hacer trampa"};

Objeto[][] p2 = {

{"Dumb", "1234",new Integer(50), nuevo booleano(falso),nuevo booleano(falso),"01234"},

{"Agua", "1235",nuevo entero(75), nuevo booleano(verdadero),nuevo booleano(falso) ,"05678"}};

String[] n2 = {"Nombre", "ID de estudiante", "Matemáticas", "Aprobado", "Hacer trampa", "Teléfono"}

int modelo = 1;

pública MiTabla(int i){

modelo = i

}

pública int; getColumnCount() {

if(model ==1)

devuelve n1.length

else

devuelve n2.length;

}

public int getRowCount() {

if(model ==1)

return p1.length

p>

else

return p2.length

}

public String getColumnName(int col) {

if( modelo ==1)

devuelve n1[col];

else

devuelve n2[col]; }

objeto público getValueAt(int fila, int col) {

if(model == 1)

return p1[fila][col]; /p>

else

return p2[fila][col];

}

Clase pública getC

olumnClass(int c) {

return getValueAt(0, c).getClass();

}

}

TableColumnModel:

TableColumnModel en sí es una interfaz que define muchos métodos relacionados con las "columnas (filas)" de la tabla, como agregar columnas, eliminar columnas, configurar y obtener "columnas" "Información relacionada

. Por lo general, no implementaremos directamente la interfaz TableColumnModel, sino que usaremos el método getColumnModel()

de JTable para obtener el objeto TableColumnModel y luego usaremos este objeto para

p>Configuración de campo Por ejemplo, si la tabla que queremos diseñar es un cuadro combinado con una lista desplegable, podemos

usar TableColumnModel para lograr este efecto.

Veamos. primero en el siguiente ejemplo:

import javax.swing.table.AbstractTableModel;

import javax.swing.*

import java.awt.*;

importar java.awt.event.*;

clase pública ColumnModelTest{

public ColumnModelTest() {

JFrame f = nuevo JFrame();

/* Dado que nuestra clase MyTable hereda AbstractTableModel e implementa los métodos

getColmunCount(), getRowCount(), getValueAt(), podemos generar entidades TableModel a través de

*MiTabla.

*/

MiTabla mt=nueva MiTabla();

JTable t=nueva JTable(mt);/ /Usamos MyTable para crear JTable

JComboBox c = new JComboBox();//Creamos un objeto JComboBox

c.addItem("Taipei");//Agregamos. tres elementos nuevos para el objeto JComboBox recién creado

c.addItem("ChiaYi");

c. *Usamos el método getTableColumnModel() proporcionado por JTable para obtener el objeto TableColumnModel,

luego usamos el método getColumn() proporcionado por la clase TableColumnModel

p>

* método para obtener el Objeto TableColumn. La clase TableColumn puede realizar configuraciones específicas para cada fila de la tabla, como

establecer el ancho del campo, el encabezado de una determinada fila y configurar la entrada de elementos más complejos

*Tipo de datos, etc. Aquí, usamos el método setCellEditor() proporcionado por la clase TableColumn para usar

JComboBox como el componente de edición predeterminado para la segunda fila

< p. > */

t.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));

t.setPreferredScrollableViewportSize(new Dimension(550, 30));

JScrollPane s = nuevo JScrollPane(t);

f.getContentPane().add(s, BorderLayout.CENTER);

f.setTitle("ColumnModelTest"); > f.pack();

f.setVisible(true);

f.addWindowListener(newWindowAdapter() {

ventana vacía públicaClosing(WindowEvent e) {

System.exit(0);

}

});

}

público estático); void main(String args[]) {

new ColumnModelTest()

}

}

clase MyTable extendsAbstractTableModel{

p>

Objeto[][] p = {

{"Dumb", "Taipei",new Integer(66),

new Integer( 32), nuevo entero (98), nuevo booleano(falso),nuevo booleano(falso)},

{"Agua", "ChiaYi",nuevo entero(85),

nuevo entero (69), nuevo entero (154), nuevo booleano (verdadero), nuevo booleano (falso)},

};

Cadena[] n = {"Nombre ",

p>

"Residencia",

"Chino",

"Matemáticas",

"Puntuación total",

"pasar",

"hacer trampa"};

public int getColumnCount() {

return n.length; >

}

public int getRowCount() {

return p.length

> }

Cadena pública getColumnName(int col) {

return n[col]

}

Objeto público getValueAt(int; fila, int col) {

return p[fila][col];

}

public Class getColumnClass(int c) {

return getValueAt(0, c).getClass();

}

/*pu