Author Topic: Pasar el foco de manera horizontal en las celdas de un jtable  (Read 3287 times)

gulder

  • Newbie
  • *
  • Posts: 10
  • Karma: 0
    • View Profile
Hola foro como estam espero que bien bueno hoy ando apurado con algo que no logro solucionar el lo siguiente.

Lo que intento hacer es “mover el foco entre las celdas de un jtable horizontalmente intercalado con la tecla enter y que cuando una celda tome el foco la coloque editable y le pase el curso”
Lo que llevo hasta el momento el lo siguiente, ya logro mover el foco de manera horizoltal con el “enter” con el siguiente código

Code: [Select]
   private void jTable1KeyPressed(java.awt.event.KeyEvent evt) {                                  

        if (evt.getKeyCode()==java.awt.event.KeyEvent.VK_ENTER)
        {
           evt.setKeyCode(java.awt.event.KeyEvent.VK_TAB);
           {
             //este codigo lo que hace es convertir el enter en tab
           }
        }

    }

Con este codigo mueve de manera horizontal el foco entre las celdas de mi Jtable, pero ahora lo que me falta es que el foco se mueva intercalado es decir me explico mejor con la siguiente imagen









Osea que solo el foco se va a mover el las columnas 1 3 5 que son las que son editables pero el problema es que no se como pasar el foco intercalado en las celdas del Jtable, pero no se si sea de ayuda este código,

Code: [Select]
   
    jTable1.editCellAt(i,0);
    Component aComp=jTable1.getEditorComponent();
    aComp.requestFocus();

Lo que hace es hacer editable una celda de un jtable y pasarle el cursor

bueno espero que alguien me pueda colborar con este dilema que no puedo resolver gracias desde ya guldergan
« Last Edit: Agosto 14, 2010, 06:57:57 pm by gulder »

amantedelrock

  • Newbie
  • *
  • Posts: 2
  • Karma: 0
    • View Profile
Re: Pasar el foco de manera horizontal en las celdas de un jtable
« Reply #1 on: Julio 14, 2012, 04:46:44 am »
Hola que tal para configurar el modo de selección de un JTable para que la navegación al presionar la tecla "enter" sea horizontal y no vertical como viene por defecto, basta con 1 línea de código.

JTable MyTable = new JTable(new DefaultTableModel());
MyTable.super.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "selectNextColumnCell");

funciona perfectamente...

Relacionado con el tema aquí os dejo un código que acabe de desarrollar, es sencillo pero da una usabilidad increible a tus tablas, consiste en  heredar de la clase JTable y hace que la navegación en Tu tabla con la tecla "enter" sea horizontal (como vimos anteriormente) y ademas cuando el foco se pasa a una celda hace que esta quede habilitada para editar y si la celda no es editable lo que hace es pasar el foco a la siguiente celda editable (funciona al pasar el foco a una celda sin importar si ha sido con el click del mouse, con la tecla "enter" o con las flechas del teclado), y funciona en ambos sentidos de izquierda a derecha y de derecha a izquierda. Tiene validación para saber cuando debe pasar el foco a la siguiente fila.


Este es el TableModel personalizado que utilizo, pero no es necesario para la funcionalidad que mencione, tan sólo quise mostrarlo.

import java.util.List;
import javax.swing.table.DefaultTableModel;

public class DataManager extends DefaultTableModel {
   
     private List<Object[]> oModel;
     private List<ColumnModel> oColumnsModel;
     
     public void setModel(List<Object[]> oModel, List<ColumnModel> oColumnsModel) {
        this.oModel = oModel;
        this.oColumnsModel = oColumnsModel;
        // Se agregan las columnas al modelo
        for(ColumnModel oColumnName : oColumnsModel)
            super.addColumn(oColumnName.getName());
        // Se agregan los datos al modelo
        for(Object[] oRow : oModel)
            super.addRow(oRow);
        // Se agrega una fila vacia
        super.addRow(new Object[oColumnsModel.size() - 1]);
    }
     
    @Override
    public void setValueAt(Object oValue, int iRow, int iColumn) {
        Object[] oRow = oModel.get(iRow);
        oRow[iColumn] = oValue;
        oModel.set(iRow, oRow);
        super.setValueAt(oValue, iRow, iColumn);
    }
   
    @Override
    public Class getColumnClass(int iColumn) {
        return oColumnsModel.get(iColumn).getDataType();
    }
   
    @Override
    public boolean isCellEditable(int iRow, int iColumn) {
        return oColumnsModel.get(iColumn).getEditable();
    }
   
}


Y aquí nuestro JTable con funcionalidad personalizada


import java.awt.event.KeyEvent;
import javax.swing.JTable;
import javax.swing.KeyStroke;

public class TableModel extends JTable {
   
    private int iOldColumn = 0;
    private int iOldRow = 0;
   
    public TableModel() {
        // Se cambio el modo de cambio de foco de la tecla enter para que sea horizontal y no vertical
        super.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "selectNextColumnCell");
    }
   
    @Override
    public void changeSelection(final int iRow, final int iColumn, boolean bToggle, boolean bExtend) {
        boolean bIsChanged = false;
        int iRowSelect = iRow;
        int iColumnSelect = iColumn;
        super.changeSelection(iRow, iColumn, bToggle, bExtend);
        if (super.isCellEditable(iRow, iColumn))
            super.editCellAt(iRow, iColumn);
        else {
            if (iRow == iRowSelect && iColumn < iOldColumn)
                iColumnSelect--;
            else {
                if (iColumn < getColumnCount() - 1)
                    iColumnSelect++;
                else {
                    iRowSelect++;
                    iColumnSelect = 0;
                }
            }
            bIsChanged = true;
        }
        iOldColumn = iColumn;
        iOldRow = iRow;
        if (bIsChanged)
            this.changeSelection(iRowSelect, iColumnSelect, bToggle, bExtend);
    }
   
}


Bueno, dejo este código aquí puede que a alguien le sea útil...

Se bueno...

amantedelrock

  • Newbie
  • *
  • Posts: 2
  • Karma: 0
    • View Profile
Re: Pasar el foco de manera horizontal en las celdas de un jtable
« Reply #2 on: Julio 14, 2012, 04:53:17 am »
Espero no que no se hallan confundido con la clase "ColumnModel", en realidad es un clase que creé la cual tiene propiedades como el titulo de la columna, si es editable o no, el tipo de dato de las celdas de la columna, el color de las celdas de la columna y como se pueden dar cuenta la utilizo en my "DefaultTAbleModel" personalizado... mejor dicho aqui dejo el codigo de la clase...

import java.awt.Color;

public class ColumnModel {
   
    private Class oDataType;
    private boolean bIsEditable;
    private String sName;
    private Color oColumnColor;
    private Color oCellColor;

    public ColumnModel() { }

    public ColumnModel(Class oDataType, boolean bIsEditable, String sName, Color oColumnColor, Color oCellColor) {
        this.oDataType = oDataType;
        this.bIsEditable = bIsEditable;
        this.sName = sName;
        this.oColumnColor = oColumnColor;
        this.oCellColor = oCellColor;
    }
   
    public boolean getEditable() {
        return bIsEditable;
    }

    public void setEditable(boolean bIsEditable) {
        this.bIsEditable = bIsEditable;
    }

    public Color getCellColor(int iRow) {
        return oCellColor;
    }

    public void setCellColor(Color oCellColor, int iRow, boolean bReplicate) {
        this.oCellColor = oCellColor;
    }

    public Class getDataType() {
        return oDataType;
    }

    public void setDataType(Class oClass) {
        this.oDataType = oClass;
    }

    public Color getColumnColor() {
        return oColumnColor;
    }

    public void setColumnColor(Color oColumnColor) {
        this.oColumnColor = oColumnColor;
    }

    public String getName() {
        return sName;
    }

    public void setName(String sName) {
        this.sName = sName;
    }

gulder

  • Newbie
  • *
  • Posts: 10
  • Karma: 0
    • View Profile
Re: Pasar el foco de manera horizontal en las celdas de un jtable
« Reply #3 on: Julio 23, 2012, 07:49:54 pm »
hermano gracias por tu aporte todavía lo estaba necesitando... ^_^