Red de conocimiento informático - Material del sitio web - Cómo agregar JList a JTable, escriba un ejemplo

Cómo agregar JList a JTable, escriba un ejemplo

getTableCellRendererComponent se llama automáticamente y se llama para cada celda durante el dibujo de JTable.

Un renderizador es solo un renderizador. Solo puede dibujar cosas. No es un componente real y no puede permitirle inspeccionarlo. El editor es un editor y se puede personalizar, pero parece que solo aparece cuando haces clic en una celda, no puedes mantenerlo en modo de edición todo el tiempo. Entonces, como en la pregunta que hablé antes, no es muy bueno poner un JList en la celda de la tabla, es mejor usar un ComboBox como editor, haga clic en él y aparecerá un cuadro de lista desplegable. para que puedas seleccionarlo, también ahorra el espacio que ocupa la tabla y elimina la necesidad de un renderizador. Hay muchas declaraciones en los ejemplos específicos, por lo que se recomienda consultar Core Java

========================== ======= ==================================

La fuente El código de JTable es realmente demasiado complicado. ¡Intenté entenderlo varias veces! Intenté entenderlo varias veces pero fallé.

Respecto a tu pregunta, tengo una duda. Sabes que una JTable puede almacenar objetos, lo que significa que puede contener cualquier cosa, entonces, ¿realmente quieres ponerle una JList? ¿O desea colocar una serie de cadenas y luego mostrarla como una JList? Si es lo primero, el código se vuelve un poco extraño.

Lo escribí así, primero creando mi propio renderizador:

class JListTableCellRenderer implements TableCellRenderer {

@Override

public Component getTableCellRendererComponent(JTable table,

Valor del objeto, booleano isSelected, booleano hasFocus, int fila,

int columna) {<

valor de retorno (JList)

}<; /p>

}

Devolver una JList no es problema ya que es solo una JList, pero si quieres almacenar un array puedes escribirlo así:

class ArrayTableCellRenderer extiende JList implementa TableCellRenderer {

@Override

componente público getTableCellRendererComponent(tabla JTable,

valor de objeto, booleano isSelected, booleano hasFocus, int fila,

int columna) {

this.setListData((Object[]) value);

devuelve esto;

}

}

Entonces debes tener un TableModel que pueda obtener el tipo de datos de la columna:

DefaultTableModel model = new DefaultTableModel(5, 1) {

@Override

clase pública getColumnClass(int columnIndex) {

if (columnIndex == 0) devuelve JList.class;

devuelve super. getColumnClass(columnIndex);

return super.class

Luego dígale a JTable la operación anterior:

JTable table = new JTable(model);

table.setDefaultRenderer( JList.class, new JListTableCellRenderer());

La limitación de esto es que una de las columnas debe ser un objeto JList, pero esto no es un problema y se cambia fácilmente , así:

p>

clase estática MyTableCellRenderer extiende DefaultTableCellRenderer {

@Override

componente público getTableCellRendererComponent(tabla JTable)

Objeto valor, booleano isSelected, booleano hasFocus, int fila,

int columna) {

if (true /* alguna condición */)

return (

JList ) valor;

De lo contrario, devuelve super.getTableCellRendererComponent(tabla,

valor, isSelected, hasFocus, fila, columna

}

<); p> }

Luego configure esto como el renderizador de toda la tabla

La operación anterior se puede completar con referencia al núcleo de Java

El problema es que su JList debe garantizar que haya suficiente altura para mostrar la tabla, porque el mecanismo de JTable es llamar al método de dibujo del componente devuelto por el renderizador de celdas para dibujar la tabla, en lugar de colocar realmente un componente en la tabla, por lo que si hay hay demasiados datos, la tabla no se puede mostrar

.