Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ZedGe en 24 Noviembre 2011, 04:09 am



Título: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 04:09 am
El problema es que tengo una tabla, de 1 fila y 5 columnas, hice que al apretar 1 elemento se seleccione la fila completa, y ademas que no lo editen.


El "PROBLEMA" es que no logro por ejemplo, que los datos de la fila seleccionada aparezcan no se, en un jlabel o un textfield en la parte de abajo, intente con algunos SYSTEM para ver que variable contenía la selección y nada. Espero me entiendan adjunto mi codigo...

Código:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class pru extends JFrame{
           
       public pru()
    {

        JTable tblEjemplo = new JTable();
        JScrollPane scpEjemplo= new JScrollPane();
         
       
        //Llenamos el modelo
        DefaultTableModel dtmEjemplo = new DefaultTableModel(getFilas(),
                                                             getColumnas());
       

        tblEjemplo=new JTable(dtmEjemplo){
        public boolean isCellEditable(int rowIndex, int vColIndex) {
            return false;
           
        }}; //return false: Desabilitar edición de celdas.
       
        tblEjemplo.setModel(dtmEjemplo);
        scpEjemplo.add(tblEjemplo);
        this.add(scpEjemplo);
        this.setSize(500, 200);
        scpEjemplo.setViewportView(tblEjemplo);
       
    }

    //Datos de las filas
    private Object[][] getFilas()
    {
         Object fila[][]=new Object[][] {
                            {"a1", "b1", "c1", "d1", "a"},
                            {"a2", "b2", "c2", "d2","a"},
                            {"a3", "b3", "c3", "d3","a"}};
 
         return fila;
               
    }

    //Encabezados de la tabla
    private String[] getColumnas()
    {
          String columna[]=new String[]{"A","B","C", "D", "E"};
          return columna;
    }

   
    public static void main(String args[]) {
        pru obj = new pru();
        obj.setVisible(true);
       
    }
}




Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: RyogiShiki en 24 Noviembre 2011, 04:15 am
Pues lo acabo de probar y no he tenido problemas, los datos aparecen normal. Si este no es el problema por favor explícate mejor.

(http://k10.kn3.net/E92DD268D.png)

Saludos


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 04:53 am
El programa lo que ahce es al poner 1 celda se selecciona toda la fila... lo que quiero es que al seleccionarla abajo de la tabla donde no hay nada exista un text field o un jlabel que imprima los datos de la fila seleccionada


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: RyogiShiki en 24 Noviembre 2011, 16:03 pm
Eso es algo más o menos complicado de hacer.lo que necesitas es implementar un ListSelectionListener (http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/event/ListSelectionListener.html) Aquí un ejemplo: http://www.java2s.com/Code/Java/Swing-JFC/ListeningforSelectionEventsinaJTableComponent.htm

No sabría decirte como hacerlo exactamente ya que nunca he tenido la necesidad de usar uno de esos.

Saludos


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 16:21 pm
ok gracias lo vere haber si se puede hacer algo...


Lo que quiero hacer es que ingrese un datos en un jlabel y los busque y lo muestre en un Jtable.

Y en caso de que hallan unos 4 al seleccionar 1 de esos esa misma info salga en un jtextfield abajo. Intente en vez de un Jtable, un jlabel gigante pero me salian descuadradas los datos por que necesitaban un orden como:


Código      Cantidad      Nombre
4454544    21               Producto 1
4545454545 246                  Producto 2

al tener un codigo ams grande o mayor cantidad quedaba todo desconfigurado


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 17:42 pm
testeen este codigo..... creo que aqui esta la solucion tengo que adaptarlo nada mas =D

Código:
package puntodeventa;





import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author beastieux
 */
public class pr extends JFrame {

    private JTable tblEjemplo;
    private JScrollPane scpEjemplo;
    private DefaultTableModel dtmEjemplo;

    public pr()
    {

        tblEjemplo = new JTable();
        scpEjemplo= new JScrollPane();

        //Llenamos el modelo
        dtmEjemplo = new DefaultTableModel(getFilas(),
                                                             getColumnas());

        tblEjemplo.setModel(dtmEjemplo);
        scpEjemplo.add(tblEjemplo);
        this.add(scpEjemplo);
        this.setSize(500, 200);
        scpEjemplo.setViewportView(tblEjemplo);

        setEventoMouseClicked(tblEjemplo);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }

    //Datos de las filas
    private Object[][] getFilas()
    {
         Object fila[][]=new Object[][] {
                            {"a1", "b1", "c1", "d1"},
                            {"a2", "b2", "c2", "d2"},
                            {"a3", "b3", "c3", "d3"}};
         return fila;
    }

    //Encabezados de la tabla
    private String[] getColumnas()
    {
          String columna[]=new String[]{"A","B","C", "D"};
          return columna;
    }

    private void setEventoMouseClicked(JTable tbl)
    {
        tbl.addMouseListener(new java.awt.event.MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
        tblEjemploMouseClicked(e);
        }
        });
    }

    private void tblEjemploMouseClicked(java.awt.event.MouseEvent evt) {

       String cadena="";

        int row = tblEjemplo.rowAtPoint(evt.getPoint());
        if (row >= 0 && tblEjemplo.isEnabled())
        {
            for (int i=0; i < tblEjemplo.getColumnCount();i++)
            {
               cadena=cadena + " " +  dtmEjemplo.getValueAt(row,i).toString();
            }
        }

        JOptionPane.showMessageDialog(null, cadena);
    }

    public static void main(String args[]) {
        pr obj = new pr();
        obj.setVisible(true);
    }
}


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: RyogiShiki en 24 Noviembre 2011, 17:48 pm
Así es, funciona bastante bien. Una buena solución hacerlo con MouseEvents, más simple.

Saludos


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: Leyer en 24 Noviembre 2011, 18:08 pm
que tal asi?
Código
  1. import java.awt.BorderLayout;
  2. import java.awt.GridLayout;
  3. import java.awt.event.KeyEvent;
  4. import java.awt.event.KeyListener;
  5. import java.awt.event.MouseEvent;
  6. import java.awt.event.MouseListener;
  7.  
  8. import javax.swing.JFrame;
  9. import javax.swing.JPanel;
  10. import javax.swing.JScrollPane;
  11. import javax.swing.JTable;
  12. import javax.swing.JTextArea;
  13. import javax.swing.JTextField;
  14. import javax.swing.SwingUtilities;
  15. import javax.swing.table.DefaultTableModel;
  16.  
  17. public class pru extends JFrame implements KeyListener,MouseListener{
  18. private static final long serialVersionUID = 1L;
  19. private JTable table = new JTable();
  20.    private JTextField textField=new JTextField(10);
  21.    private JTextArea textArea =new JTextArea();
  22.  
  23.    public pru(){
  24. this.setLayout(new GridLayout(2,0));
  25. textField.addKeyListener(this);
  26. textField.setText("Dato a buscar");
  27.        JScrollPane scpEjemplo= new JScrollPane();
  28.        JPanel panel=new JPanel(new GridLayout());
  29.        JScrollPane jScrollPane=new JScrollPane(textArea);
  30.        panel.add(jScrollPane);
  31.        textArea.setEnabled(false);
  32.        textArea.setEditable(false);
  33.        //Llenamos el modelo
  34.        DefaultTableModel dtmEjemplo = new DefaultTableModel(getFilas(), getColumnas());
  35.  
  36.        table=new JTable(dtmEjemplo){
  37. private static final long serialVersionUID = 1L;
  38. public boolean isCellEditable(int rowIndex, int vColIndex) {
  39.            return false;
  40.  
  41.        }}; //return false: Desabilitar edición de celdas.
  42.        table.setModel(dtmEjemplo);
  43.        table.addMouseListener(this);
  44.       // table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  45.        scpEjemplo.add(table);
  46.        JPanel panel2=new JPanel(new BorderLayout());
  47.        panel2.add(textField,BorderLayout.NORTH);
  48.        panel2.add(scpEjemplo,BorderLayout.CENTER);
  49.        this.add(panel2);
  50.        this.add(panel);
  51.        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  52.        this.setSize(500, 400);
  53.        scpEjemplo.setViewportView(table);
  54.    }
  55.    //Datos de las filas
  56.    private Object[][] getFilas(){
  57.         Object fila[][]=new Object[][] {
  58.                            {"a1", "b1", "c1", "d1", "a"},
  59.                            {"a2", "b2", "c2", "d2","a"},
  60.                            {"a3", "b3", "c3", "d3","a"},
  61.                            {"a1", "b1", "c1", "d1", "a"},
  62.                            {"a2", "b2", "c2", "d2","a"},
  63.                            {"a3", "b3", "c3", "d3","a"},
  64.         {"a3", "b3", "c3", "d3","b"}};
  65.         return fila;
  66.  
  67.    }
  68.    public void search(String data) {
  69.     textArea.setText("");
  70. int numberOfRows = table.getRowCount();
  71. for (int row = 0; row < numberOfRows; row++) {
  72. for(int column=0;column<table.getColumnCount();column++){
  73. String temp = (String) table.getValueAt(row, column);
  74. if (temp.equalsIgnoreCase(data)) {
  75. table.changeSelection(row,0,false,true);
  76. int[] rows = table.getSelectedRows();
  77. String val="";
  78. for(row=0;row<rows.length;row++){
  79. for(column=0;column<table.getColumnCount();column++){
  80. val+=table.getValueAt(rows[row], column)+"                    ";
  81. }
  82. val+="\n";
  83. }
  84. System.out.println(val);
  85. textArea.append(val);
  86. break;
  87. }
  88. }
  89.  
  90. }
  91. }
  92.    //Encabezados de la tabla
  93.    private String[] getColumnas(){
  94.          String columna[]=new String[]{"A","B","C", "D", "E"};
  95.          return columna;
  96.    }
  97.    public static void main(String args[]) {
  98.     SwingUtilities.invokeLater(new Runnable() {
  99. @Override
  100. public void run() {
  101. pru obj = new pru();
  102.        obj.setVisible(true);
  103. }
  104. });
  105.    }
  106. @Override
  107. public void keyPressed(KeyEvent arg0) {
  108. if(arg0.getKeyCode() ==KeyEvent.VK_ENTER)search(textField.getText());
  109. }
  110. @Override public void keyReleased(KeyEvent arg0) {}
  111. @Override public void keyTyped(KeyEvent arg0) {}
  112.  
  113. @Override
  114. public void mouseClicked(MouseEvent arg0) {
  115. int[] rows = table.getSelectedRows();
  116. String val="";
  117. textArea.setText("");
  118. for(int row=0;row<rows.length;row++){
  119. for(int column=0;column<table.getColumnCount();column++){
  120. val+=table.getValueAt(rows[row], column)+"                    ";
  121. }
  122. val+="\n";
  123. }
  124. //System.out.println(val);
  125. textArea.append(val);
  126.  
  127. }
  128. @Override
  129. public void mouseEntered(MouseEvent arg0) {
  130. // TODO Auto-generated method stub
  131.  
  132. }
  133. @Override
  134. public void mouseExited(MouseEvent arg0) {
  135. // TODO Auto-generated method stub
  136.  
  137. }
  138. @Override
  139. public void mousePressed(MouseEvent arg0) {
  140. // TODO Auto-generated method stub
  141.  
  142. }
  143. @Override
  144. public void mouseReleased(MouseEvent arg0) {
  145. // TODO Auto-generated method stub
  146.  
  147. }
  148. }
  149.  


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 18:21 pm
No me funciona tu codigo, osea selecciona la fila y todo pero el evento no me funciona..


también estoy intentado lograr que las columnas tengan anchos diferentes y no me sale :S es re dificil trabajar con jtable pero era la unica opcion que tenia


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: Leyer en 24 Noviembre 2011, 18:30 pm
si no precionas enter no funciona :xD :xD :xD


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: ZedGe en 24 Noviembre 2011, 18:36 pm
xD

Gracias Amigo De Todas formas el codigo que envie yo tambien funciona al 100% ese de apretar y que salga un popup o algo así (ventana emergente), si a alguien ls sirve
aquí el código para deerminar el ancho de una columna

Código:
  tuJTable.getColumnModel().getColumn(0).setResizable(false);//esto para que no se pueda editar el anocho manualmente
 
 tuJTable.getColumnModel().getColumn(0).setPreferredWidth(500); // 500 es el tamaño de la columna, aun que pongas 1 el tamaño no sera casi invisible, ya que viene uno predeterminado

xD


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: RyogiShiki en 24 Noviembre 2011, 18:46 pm
si no precionas enter no funciona :xD :xD :xD

Wow no he visto el código bien, pero a penas busco un dato Bum! Loop infinito! XD. Solo aviso.
--EDIT--
Solo da problemas al buscar el dato d3.
--EDIT 2--
El problema solo se dá cuando recorro la lista varias veces y busco un dato. Es en reaidad un problema algo dificil de reproducir.

Saludos


Título: Re: Problema Con Selección De Fila En Jtable Y Evento
Publicado por: Leyer en 24 Noviembre 2011, 18:57 pm
Wow no he visto el código bien, pero a penas busco un dato Bum! Loop infinito! XD. Solo aviso.
--EDIT--
Solo da problemas al buscar el dato d3.
--EDIT 2--
El problema solo se dá cuando recorro la lista varias veces y busco un dato. Es en reaidad un problema algo dificil de reproducir.

Saludos

cierto, era el ListSelectionListener que le habia colocado