Jtable - modo de edição [RESOLVIDO]

5 respostas
mario.fts

Tarde…

Tenho um Jtable com renderers e editors personalizados para algumas células. Esses editors são componentes criados aqui no cliente, então tenho que usar eles ao invés dos padrões do swing.

O meu problema é o seguinte: quando o cara começa a editar um campo, um textfield por exemplo, e aperta a seta do teclado, a edição é cancelada, e o cursor se move pra célula do lado.

Eu queria saber como posso mudar esse comportamento, pq o cliente está reclamando que ele vai editando o campo, e se precisa mover o cursor pra corrigir o texto, ele tem que usar o mouse, se usar a seta do teclado a tabela muda ele de célula e ele perde o que tava editando.

já tentei com ListSelectionListener, mas não deu certo, alguma outra sugestão?

5 Respostas

Hellmanss

Talvez daria para você add um KeyListner, capturar o evento da tecla e usar o método consume

mario.fts

Quase deu certo. o problema é que como o evento foi consumido, nem o textfield pega ele, ou seja, o cursor não muda para a letra anterior. :lol:

vou colocar um código de exemplo com uma tabela que achei na net:

public class ScrollableJTable{
  public static void main(String[] args) {
    new ScrollableJTable();
  }
  public ScrollableJTable(){
    JFrame frame = new JFrame("Creating a Scrollable JTable!");
    JPanel panel = new JPanel();
    String data[][] = {{"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                       {"001","vinod","Bihar","India","Biology","65","First"},
                       {"002","Raju","ABC","Kanada","Geography","58","second"},
                       {"003","Aman","Delhi","India","computer","98","Dictontion"},
                       {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"}};
    String col[] = {"Roll","Name","State","country","Math","Marks","Grade"};
    JTable table = new JTable(data,col);
    
    JScrollPane pane = new JScrollPane(table);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    panel.add(pane);
    frame.add(panel);
    frame.setSize(500,150);
    frame.setUndecorated(true);
    frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

para testar, eu estou fazendo assim:

clico em uma célula.
digito alguma coisa.
aperto a seta para a esquerda.

nesse momento a edição é finalizada, e o cursor muda para a célula ao lado.

fabiofalci

Mas esse comportamento não foi inserido por vcs?
Não dá pra ir nesse componente e remover esse comportamento?

mario.fts

Não, quando eu uso o componente num form normal o comportamento é igual ao do textfield. o problema é só quando ta dentro da tabela.

Esse exemplo que eu postei usa só os renderers padrões, que são JtextFields, e o comportamento tbm está “errado”.

Olha que engraçado.

Se vc clica (simples) em uma célula e começa a editar, e depois usa a seta, ele muda de celula na tabela.

Se vc clica (duplo) em uma célula, ele entra em edição, vc começa a digitar e depois usa a seta, ai ele funciona direito, mudando só a posição do cursor dentro do textfield. O que eu queria é que o comportamento sempre fosse esse.

mario.fts

RESOLVIDO:

muito fácil. só colocar

ai quando vc começa a editar a célula pelo teclado e não pelo mouse, ele passa o controle para o componente.

Obrigado a todos pelas respostas, valeu!!!

Criado 21 de janeiro de 2010
Ultima resposta 21 de jan. de 2010
Respostas 5
Participantes 3