Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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...


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


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 (java) [Seleccionar]

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class pru extends JFrame implements KeyListener,MouseListener{
private static final long serialVersionUID = 1L;
private JTable table = new JTable();
    private JTextField textField=new JTextField(10);
    private JTextArea textArea =new JTextArea();

    public pru(){
this.setLayout(new GridLayout(2,0));
textField.addKeyListener(this);
textField.setText("Dato a buscar");
        JScrollPane scpEjemplo= new JScrollPane();
        JPanel panel=new JPanel(new GridLayout());
        JScrollPane jScrollPane=new JScrollPane(textArea);
        panel.add(jScrollPane);
        textArea.setEnabled(false);
        textArea.setEditable(false);
        //Llenamos el modelo
        DefaultTableModel dtmEjemplo = new DefaultTableModel(getFilas(), getColumnas());
     
        table=new JTable(dtmEjemplo){
private static final long serialVersionUID = 1L;
public boolean isCellEditable(int rowIndex, int vColIndex) {
            return false;
           
        }}; //return false: Desabilitar edición de celdas.
        table.setModel(dtmEjemplo);
        table.addMouseListener(this);
       // table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        scpEjemplo.add(table);
        JPanel panel2=new JPanel(new BorderLayout());
        panel2.add(textField,BorderLayout.NORTH);
        panel2.add(scpEjemplo,BorderLayout.CENTER);
        this.add(panel2);
        this.add(panel);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(500, 400);
        scpEjemplo.setViewportView(table);
    }
    //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"},
                            {"a1", "b1", "c1", "d1", "a"},
                            {"a2", "b2", "c2", "d2","a"},
                            {"a3", "b3", "c3", "d3","a"},
          {"a3", "b3", "c3", "d3","b"}};
         return fila;
               
    }
    public void search(String data) {
    textArea.setText("");
int numberOfRows = table.getRowCount();
for (int row = 0; row < numberOfRows; row++) {
for(int column=0;column<table.getColumnCount();column++){
String temp = (String) table.getValueAt(row, column);
if (temp.equalsIgnoreCase(data)) {
table.changeSelection(row,0,false,true);
int[] rows = table.getSelectedRows();
String val="";
for(row=0;row<rows.length;row++){
for(column=0;column<table.getColumnCount();column++){
val+=table.getValueAt(rows[row], column)+"                    ";
}
val+="\n";
}
System.out.println(val);
textArea.append(val);
break;
}
}

}
}
    //Encabezados de la tabla
    private String[] getColumnas(){
          String columna[]=new String[]{"A","B","C", "D", "E"};
          return columna;
    }
    public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
pru obj = new pru();
        obj.setVisible(true);
}
});
    }
@Override
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() ==KeyEvent.VK_ENTER)search(textField.getText());
}
@Override public void keyReleased(KeyEvent arg0) {}
@Override public void keyTyped(KeyEvent arg0) {}

@Override
public void mouseClicked(MouseEvent arg0) {
int[] rows = table.getSelectedRows();
String val="";
textArea.setText("");
for(int row=0;row<rows.length;row++){
for(int column=0;column<table.getColumnCount();column++){
val+=table.getValueAt(rows[row], column)+"                    ";
}
val+="\n";
}
//System.out.println(val);
textArea.append(val);

}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}
}
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


  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
Cita de: Leyer en 24 Noviembre 2011, 18:30 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
Cita de: RyogiShiki en 24 Noviembre 2011, 18:46 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