es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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é?

  1. ¿Cómo solucionarlo para que, sin importar dónde haga clic en cualquier orden, siempre muestre el valor en esa celda?
  2. ¿Cómo puedo saber si he hecho clic con el botón izquierdo del ratón o el botón derecho del ratón?
Tags:  , , ,

Answer

  1. Avatar for 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:

    public void valueChanged(ListSelectionEvent e)
    {
      if (!e.getValueIsAdjusting()) { // verificar si la selección ha terminado de cambiar
        String selectedData=null;
    
        int[] selectedRow=table.getSelectedRows();
        int[] selectedColumns=table.getSelectedColumns();
    
        for (int i=0;i<selectedrow.length;i++) for="" (int="" j=""></selectedrow.length;i++)><selectedcolumns.length;j++)
            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.

    1. 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:
    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 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);
    }
    }


    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 actual.>

Comments are closed.