Cómo agregar JList a JTable, escriba un ejemplo
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
.