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.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
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>
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] }
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 cadenaPor 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>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>
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