Author Topic: Como hacer que las celdas no sea editable en un JTable  (Read 35596 times)

LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Como hacer que las celdas no sea editable en un JTable
« on: Noviembre 28, 2010, 09:32:08 pm »
Tengo ese problema, con el código que muestro a continuación es el relleno que va a tener el JTable y no se que código hay que poner para que todas las celdas no sean editables.

Code: [Select]
package clases;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Formatter;
import java.util.GregorianCalendar;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class func_relleno_registros extends DefaultTableCellRenderer
{
    public func_relleno_registros() { //
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
            GregorianCalendar c1 = new GregorianCalendar();
            Formatter fmtFecha = new Formatter();
            int dia = (c1.get(GregorianCalendar.DATE));
            int mes = (c1.get(GregorianCalendar.MONTH) + 1);
            int ano = (c1.get(GregorianCalendar.YEAR));
            fmtFecha.format("%1$02d/%2$02d/"+ano,dia,mes);
            // Creamos la etiqueta
            JLabel etiqueta = new JLabel();
            // Ponemos un color distinto para la etiqueta según si la celda está o no seleccionada.
            if (isSelected){
                etiqueta.setBackground(Color.ORANGE);
                Font f = new Font("TAHOMA", Font.BOLD, 12);
                etiqueta.setFont(f);
            }else{
                etiqueta.setBackground(Color.WHITE);
                Font f1 = new Font("TAHOMA", Font.PLAIN, 12);
                etiqueta.setFont(f1);
            }
            // Para centrar el texto de las columnas.
            if ((column == 0) || (column == 1) || (column == 3)){
                etiqueta.setHorizontalAlignment(JLabel.CENTER);
            }
            // Si el objeto que nos pasan es un String, lo ponemos en el JLabel.
            if (value instanceof String)
            {
                // Para que el JLabel haga caso al color de fondo, tiene que ser opaco.
                etiqueta.setOpaque(true);
                etiqueta.setText((String)value);
            }
            if (value instanceof String != isSelected){
                String valor = ((String)value).toString();
                if (valor.equals(""+fmtFecha)){
                    etiqueta.setForeground(Color.BLUE);
                    Font t3 = new Font("TAHOMA", Font.BOLD, 12);
                    etiqueta.setFont(t3);
                }
            }
        return etiqueta;
    }
}

Lo he intentado con .isCellEditable() y nada.

Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #1 on: Noviembre 28, 2010, 09:47:12 pm »
Mira aquí http://chuwiki.chuidiang.org/index.php?title=JTable en el apartado 3.

Se bueno.

LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #2 on: Noviembre 28, 2010, 10:53:19 pm »
Ese código lo leí hace mucho tiempo y no hubo manera de hacer funcionar.

Code: [Select]
public class MiModelo extends DefaultTableModel
{
   public boolean isCellEditable (int row, int column)
   {
       // Aquí devolvemos true o false según queramos que una celda
       // identificada por fila,columna (row,column), sea o no editable
       if (column == 3)
          return true;
       return false;
   }
}

Le agradecería que revise mi código anterior y veas donde puedo añadir ese fragmento de "isCellEditable(int row, int column). Pero creo que hay que tener en cuenta que ese fragmento esta usando un DefaultTableModel y en mi código para mi JTable esta usando "DefaultTableCellRenderer".

Un saludo, gracias.

LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #3 on: Noviembre 29, 2010, 01:52:23 am »
He probado de la siguiente manera y tampoco me ha funcionado. Mira el comentario en el código en mayúscula, es el nuevo código que acabo de añadir y nada.

Code: [Select]
package clases;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Formatter;
import java.util.GregorianCalendar;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class func_relleno_registros extends DefaultTableCellRenderer
{
    //NUEVO FRAGMENTO DE CÓDIGO PARA "ISCELLEDITABLE"
    public boolean isCellEditable (int row, int column)
    {
       if (column == 1){
          return true;
       }else{
        return false;
       }
    }
    //FINAL DEL FRAGMENTO DE CÓDIGO
    public func_relleno_registros() {
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
            GregorianCalendar c1 = new GregorianCalendar();
            Formatter fmtFecha = new Formatter();
            int dia = (c1.get(GregorianCalendar.DATE));
            int mes = (c1.get(GregorianCalendar.MONTH) + 1);
            int ano = (c1.get(GregorianCalendar.YEAR));
            fmtFecha.format("%1$02d/%2$02d/"+ano,dia,mes);
            // Creamos la etiqueta
            JLabel etiqueta = new JLabel();
            // Ponemos un color distinto para la etiqueta según si la celda está o no seleccionada.
            if (isSelected){
                etiqueta.setBackground(Color.ORANGE);
                Font f = new Font("TAHOMA", Font.BOLD, 12);
                etiqueta.setFont(f);
            }else{
                etiqueta.setBackground(Color.WHITE);
                Font f1 = new Font("TAHOMA", Font.PLAIN, 12);
                etiqueta.setFont(f1);
            }
            // Para centrar el texto de las columnas.
            if ((column == 0) || (column == 1) || (column == 3)){
                etiqueta.setHorizontalAlignment(JLabel.CENTER);
            }
            // Si el objeto que nos pasan es un String, lo ponemos en el JLabel.
            if (value instanceof String)
            {
                // Para que el JLabel haga caso al color de fondo, tiene que ser opaco.
                etiqueta.setOpaque(true);
                etiqueta.setText((String)value);
            }
            if (value instanceof String != isSelected){
                String valor = ((String)value).toString();
                if (valor.equals(""+fmtFecha)){
                    etiqueta.setForeground(Color.BLUE);
                    Font t3 = new Font("TAHOMA", Font.BOLD, 12);
                    etiqueta.setFont(t3);
                }
            }
        return etiqueta;
    }
}

Espero que haya alguna solución, porque sino de esta forma puedo editar las celdas directamente desde un JTable.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #4 on: Noviembre 29, 2010, 02:36:09 am »
buenas.

El isCellEditable() debe ir en el TableModel. El TableRender es otra cosa. Sigue el ejemplo de la wiki, heredando de DefaultTableModel y metiéndolo en el JTable (constructor o setModel())

Se bueno.
« Last Edit: Noviembre 29, 2010, 02:38:52 am by chuidiang »

LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #5 on: Noviembre 29, 2010, 02:07:40 pm »
Buenas.

He vuelvo a leer entre líneas: he creado una clase con DefaultTableModel y dentro de ella esta el código para "isCellEditable()". El siguiente paso que hice fue crear un TableModel modelo = new TableModel(); a continuación al JTable que se llama "tabla" enlazo así: tabla.setModel(modelo).

Y sigue sin funcionar de ninguna manera que turnee un poco el código y ná.
Esta noche te envío el código que he creado y donde se ubica cada fuente de código.

Siento que sea un poco pesado con el tema, pero necesito que no sea editable el JTable. Además no tengo a nadie que conozca la programación de Java y por eso recurro a este foro.

Un saludo, gracias.  :)

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #6 on: Noviembre 29, 2010, 03:04:26 pm »
Hola:

Esto funciona, mira a ver qué estás haciendo mal.
Code: [Select]
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class PruebaJTable
{
public static void main( String [] args)
{
JFrame f = new JFrame();
DefaultTableModel modelo = new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};

JTable t = new JTable(modelo);
modelo.addColumn("una columna");
modelo.addRow(new String []{"1"});
f.getContentPane().add(t);
f.pack();
f.setVisible(true);
}
}


LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #7 on: Noviembre 30, 2010, 02:29:55 am »
Muchas gracias.

Ya esta solucionado mi problema con este código que has aportado. Ahora si que tengo el JTable con todas las celdas que no se puedan editar.

Un saludo y buenas noches.  ;)

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #8 on: Noviembre 30, 2010, 02:47:32 am »
¿y qué es lo que estabas haciendo mal?. Este trozo de código es lo mismo que pone la wiki, sólo que completo con un main().

Se bueno.

LUIS ANTONIO

  • Jr. Member
  • **
  • Posts: 82
  • Karma: 0
    • View Profile
Re: Como hacer que las celdas no sea editable en un JTable
« Reply #9 on: Diciembre 01, 2010, 01:16:40 am »
Buenas tardes.

En mi proyecto tengo preparado dos clases para el JTable (clase rellenotabla y clase modelotabla), entonces desde el JFrame principal del proyecto implemente el siguiente código:

- tabla.setDefaultRederer(Object.class,rellenotabla).
Teniendo en cuenta que las columnas la añadía así antes:
- rellenotabla.addColumn("Registro:"); ...
Luego le puse:
- tabla.setModel(modelotabla);
Y no funcionaba de ninguna manera.

LA SOLUCIÓN:
cambiar: modelotabla.addColumn("Registro: ");
Desde ahí en adelante ha funcionado con éxito, funcionando el rellenotabla para los colores de fondo y el tipo de letra, además también para el modelotabla que todas las celdas no son editables.


Un saludo. Gracias de nuevo.

 

ey