[Swing] JTable et petits problèmes [Résolu]

Messages postés
23
Date d'inscription
mercredi 27 juillet 2005
Dernière intervention
12 septembre 2005
- - Dernière réponse : jpbodiong
Messages postés
5
Date d'inscription
dimanche 17 juin 2007
Dernière intervention
27 juin 2009
- 5 août 2007 à 18:25
Bonjour,

voila, je suis en train de développer dans le cadre de mes études un programme de gestion de généalogie.

Afin d'afficher les individus enregistrés dans le programme, je créé une JTable que je remplis

Cependant, jai des problèmes.

Je m'explique.

Quand je créé ma JTable, je ne veux pas que l'on puisse modifier le
texte des cellules (cela se fait par une autre fenêtre de mon ihm),
mais je veux tout de meme pouvoir les selectionner, afin, en cas de
double click sur une cellule, afficher la fenêtre de cette personne.

Mes problèmes sont donc que je n'arrive pas à trouver comment faire ca
(ie : afficher les cellules, interdire la modification, pouvoir les
selectionner et faire une action sur un double click).



Je pourrais autrement rajouter à la fin de mon tableau, sur la droite,
des boutons permettant d'accéder à la fiche de cette personne. Le
problème étant que la récupération des données est dynamique, et je ne
vois pas comment creer des fonctions du genre

btnXCliqued en série en dynamique, au sein d'un while ... Cela voudrait
donc dire creer des boutons à la volée, et les fonctions qui vont avec,
que je devrais implémenter..

J'avais commencé à faire comme ceci, mais il faudrais que je puisse
passer les informations sur l'id de la personne sélectionnée ..

for (int i = 0; i < TableauDescendance.getRowCount() - 1; i++)

{

JButton toto = new JButton();

toto.setText("Test de merde ");

toto.setBounds(800, 435 + i*15, 80, 20);


toto.addMouseListener(new
java.awt.event.MouseAdapter()

{



public void mouseClicked(java.awt.event.MouseEvent
evt)



{



System.out.println("clique sur ");



}

}

);


PanelIndividu.add(toto, JLayeredPane.DEFAULT_LAYER);

}





J'espère que j'explique mon problème assez bien...



Avez vous des indications à me donner pour ma première ou ma deuxième solution ?
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
500
Date d'inscription
mercredi 20 août 2003
Dernière intervention
11 juillet 2007
3
Merci
Il faut bien que tu surdefinisse le modele de ta jtable, avec une methode



public boolean isCellEditable(int r, int c){

return false ;

}


ainsi aucune case ne sera editable,

et pour ouvrir un editeur, c'est facile, tu rajoutes un mouseListener sur ta JTable,

et tu recuperes la ligne selectionnee...

Merci dmaillet 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de dmaillet
Messages postés
162
Date d'inscription
mardi 26 avril 2005
Dernière intervention
6 novembre 2008
0
Merci
salut,
je pense que dans ton cas tu dois utiliser les modeles, il faut definire ton modele qui va heriter de AbstractTableModel ainsi tu peut personnaliser ton jtable:
je te donne un exmple de modele dans ce qui suit:
package interfac;


import javax.swing.table.*;
import java.util.*;


public class Tmodel extends AbstractTableModel
{


String[] columnNames = null ;
Object[][] data = null ;


public Tmodel(Vector v, int c,String[] header)
{
data = new Object[v.size()][c] ;
columnNames = header ;
}


public int getColumnCount()
{
return columnNames.length;
}


public Object getValueAt(int l, int c)
{
return data[l][c] ;
}


/**
* Stocker une valeur dans la table
* */
public void setValueAt(Object val ,int l, int c)
{
data[l][c] = val;
}


/**
* Obtenir le nombre de lignes
* */
public int getRowCount()
{
return data.length ;
}


/**
* Obtenir le nom d'une colonne
* */
public String getColumnName(int c)
{
return columnNames[c] ;
}


/**
* Obtenir le type de donnée d'une colonnes
* */
public Class getColumnClass(int c)
{
try
{
return getValueAt(0,c).getClass();
}
catch (Exception ex)
{
return "".getClass() ;
}
}


/* *
* Est ce que la colonne est modifiable ?
* */
public boolean isCellEditable(int r, int c)
{
return true ;
}


}
et un exemple d'utilisation :
package interfac;


import javax.swing.table.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;


public class NewTable extends JFrame implements ActionListener
{
public Vector Data=new Vector();
JPanel contentPane = new JPanel();
String[] T={"int","text","float","date"};
Boolean B=new Boolean(false);
JComboBox combo=new JComboBox(T);
Tmodel TablePerso = null ;
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = null ;


String[] colh = {"Nom","type","Null","key","reference table","table name"} ;
JLabel jLabel1 = new JLabel();
JTextField jTextField1 = new JTextField();
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
JButton jButton3 = new JButton();


public NewTable()
{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**Component initialization*/
private void jbInit() throws Exception
{


contentPane.setLayout(null);
jScrollPane1.setBorder(BorderFactory.createEtchedBorder());
jScrollPane1.setBounds(new Rectangle(24, 109, 501, 140));
jLabel1.setText("Table name :");
jLabel1.setBounds(new Rectangle(22, 38, 102, 24));
jTextField1.setText("");
jTextField1.setBounds(new Rectangle(106, 34, 169, 32));
jButton1.setBounds(new Rectangle(23, 80, 90, 22));
jButton1.setText("new Ligne");
jButton1.addActionListener(this);
jButton2.setBounds(new Rectangle(119, 80, 91, 22));
jButton2.setText("delete Ligne");
jButton2.addActionListener(this);
jButton3.setBounds(new Rectangle(371, 256, 152, 33));
jButton3.setText("Create Table");
contentPane.add(jLabel1, null);
contentPane.add(jTextField1, null);
contentPane.add(jButton1, null);
contentPane.add(jButton2, null);
contentPane.add(jScrollPane1, null);
contentPane.add(jButton3, null);


}
public void RemoveLigne(){
Data.remove(Data.size()-1);
MiseAjour();
}
//mise a jour de la table
public void MiseAjour(){
TablePerso = new Tmodel(Data,6,colh);
jTable1= new JTable(TablePerso);
jScrollPane1.getViewport().add(jTable1, null);
if(Data.size()>1){
for (int i = 0; i < Data.size(); i++) {
String[] T = (String[]) Data.elementAt(i);
for (int j = 0; i < 6; i++) {
TablePerso.setValueAt(T[j], i, j);
}
}
}
TableColumn column1=jTable1.getColumnModel().getColumn(1);
TableColumn column2=jTable1.getColumnModel().getColumn(3);
column1.setCellRenderer(new DefaultTableCellRenderer());
column1.setCellEditor(new DefaultCellEditor(combo));
column2.setCellRenderer(new DefaultTableCellRenderer());
column2.setCellEditor(new DefaultCellEditor(combo));
}
// public void
public void AddLigne(){
String[] Tab=new String[6];
if(Data.size()>=1){
for (int i = 0; i < 6; i++) {
Tab[i] = (String) TablePerso.getValueAt(Data.size() - 1, 1);
}
Data.remove(Data.size()-1);
Data.addElement(Tab);
}
Data.addElement(null);
MiseAjour();
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==this.jButton2){
RemoveLigne();
}
if(e.getSource()==this.jButton1){
AddLigne();
}
c'est vrai que ca va repond pas completement a tes questions mais ca va t'aider et c'est la bonne facon de proceder.
Commenter la réponse de mouzart
Messages postés
23
Date d'inscription
mercredi 27 juillet 2005
Dernière intervention
12 septembre 2005
0
Merci
Merci beaucoup pour cette solution dmaillet ..

C est vrai que c etait assez simple, mais je n'y avait pas pensé =)

Ca marche niquel maintenant =)
Commenter la réponse de kokojavafr
Messages postés
5
Date d'inscription
dimanche 17 juin 2007
Dernière intervention
27 juin 2009
0
Merci
JP~Bodiong




akm


Salut je developpe une application de gestion de Stock sous netBeans 5.5. j'ai un problème avec ma JTable contenu dans un ScrollPane qui est dans une JInternalFrame.le resultat des requêtes select s'affiche bien dans ma table lorsque j'execute le programme avec NetBeans. Mais lorsque je cree un jar executable avec l'ide aucun resultat de commande select ne s'affiche plus dans ma table???? Le même code donne un resultat different lorsqu'on le rend executable... comment es ce possible.
Besoin d'aide s'il faut rafraichir Comment faire§§§
Merci d'avance. Toute aide serait la bienvenue









akm
Commenter la réponse de jpbodiong

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.