¿Por qué no hay respuesta después de hacer clic en una celda de un JTable?
Tengo la siguiente muestra de la aplicación Java Swing JTable
:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class JTableListSelectionListener
{
public static void main(String[] a)
{
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table;
String[] columnTitles={"A","B","C","D"};
Object[][] rowData={{"11","12","13","14"},{"21","22","23","24"},{"31","32","33","34"},{"41","42","43","44"}};
table=new JTable(rowData,columnTitles);
table.setCellSelectionEnabled(true);
ListSelectionModel cellSelectionModel=table.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
String selectedData=null;
int[] selectedRow=table.getSelectedRows();
int[] selectedColumns=table.getSelectedColumns();
for (int i=0;i<selectedRow.length;i++)
for (int j=0;j<selectedColumns.length;j++)
selectedData=(String)table.getValueAt(selectedRow[i],selectedColumns[j]);
System.out.println("Seleccionado: "+selectedData);
}
});
frame.add(new JScrollPane(table));
frame.setLocationRelativeTo(null);
frame.setSize(300,200);
frame.setVisible(true);
}
}
No responderá si hago clic en la misma fila:
Si hago clic en “12” y luego en “13” o primero hago clic en “21” y luego en “23”, ¿por qué?
- ¿Cómo solucionarlo para que, sin importar dónde haga clic en cualquier orden, siempre muestre el valor en esa celda?
- ¿Cómo puedo saber si he hecho clic con el botón izquierdo del ratón o el botón derecho del ratón?
davy.ai
El problema con la implementación actual es que el método valueChanged del ListSelectionListener solo se llama cuando cambia la selección. Si el usuario hace clic en la misma celda nuevamente, la selección no ha cambiado y el método no se llamará. Para solucionar esto, puedes agregar una verificación adicional para ver si la selección no ha cambiado y reaccionar en consecuencia. Puedes modificar el método valueChanged de la siguiente manera:
el método e.getvalueisadjusting() verifica si la selección todavía está en proceso de cambio. si no lo está, entonces la selección ha terminado y podemos proceder a obtener el valor seleccionado.
ten en cuenta que usamos
swingutilities.isleftmousebutton
yswingutilities.isrightmousebutton
para verificar qué botón se presionó. esto se debe a que la clase mouseevent define constantes para los números de los botones, pero estos pueden ser diferentes en diferentes plataformas y apariencias. el uso de estos métodos de utilidad asegura que obtengamos el botón correcto para la plataforma actual. selecteddata=”(String)table.getValueAt(selectedRow[i],selectedColumns[j]);” system.out.println(“seleccionado:=”” “+selecteddata);=”” }=”” }=””="" el="" método="" e.getvalueisadjusting()="" verifica="" si="" la="" selección="" todavía="" está="" en="" proceso="" de="" cambio.="" si="" no="" lo="" está,="" entonces="" la="" selección="" ha="" terminado="" y="" podemos="" proceder="" a="" obtener="" el="" valor="" seleccionado.="" 2.="" para="" poder="" determinar="" si="" el="" usuario="" hizo="" clic="" con="" el="" botón="" izquierdo="" del="" mouse="" o="" con="" el="" botón="" derecho="" del="" mouse,="" puedes="" agregar="" un="" mouselistener="" a="" la="" jtable="" e="" implementar="" el="" método="" mouseclicked.="" luego="" puedes="" obtener="" el="" mouseevent="" y="" verificar="" si="" el="" botón="" presionado="" fue="" el="" botón="" izquierdo="" o="" el="" botón="" derecho="" del="" mouse.="" aquí="" tienes="" un="" ejemplo="" de="" implementación:=""
java=”” table.addmouselistener(new=”” mouseadapter()=”” {=”” public=”” void=”” mouseclicked(mouseevent=”” e)=”” {=”” if=”” (swingutilities.isleftmousebutton(e))=”” {=”” se=”” hizo=”” clic=”” en=”” el=”” botón=”” izquierdo=”” system.out.println(“se=”” hizo=”” clic=”” en=”” el=”” botón=”” izquierdo”);=”” }=”” else=”” if=”” (swingutilities.isrightmousebutton(e))=”” {=”” se=”” hizo=”” clic=”” en=”” el=”” botón=”” derecho=”” system.out.println(“se=”” hizo=”” clic=”” en=”” el=”” botón=”” derecho”);=”” }=”” }=”” });=”” “`=”” ten=”” en=”” cuenta=”” que=”” usamos=””swingutilities.isleftmousebutton
=”” y=””swingutilities.isrightmousebutton
=”” para=”” verificar=”” qué=”” botón=”” se=”” presionó.=”” esto=”” se=”” debe=”” a=”” que=”” la=”” clase=”” mouseevent=”” define=”” constantes=”” para=”” los=”” números=”” de=”” los=”” botones,=”” pero=”” estos=”” pueden=”” ser=”” diferentes=”” en=”” diferentes=”” plataformas=”” y=”” apariencias.=”” el=”” uso=”” de=”” estos=”” métodos=”” de=”” utilidad=”” asegura=”” que=”” obtengamos=”” el=”” botón=”” correcto=”” para=”” la=”” plataforma=””></selectedcolumns.length;j++)selecteddata=(string)table.getvalueat(selectedrow[i],selectedcolumns[j]);
system.out.println(“seleccionado: “+selecteddata);
}
}
ten en cuenta que usamos
swingutilities.isleftmousebutton
yswingutilities.isrightmousebutton
para verificar qué botón se presionó. esto se debe a que la clase mouseevent define constantes para los números de los botones, pero estos pueden ser diferentes en diferentes plataformas y apariencias. el uso de estos métodos de utilidad asegura que obtengamos el botón correcto para la plataforma actual.>