[Swing] JTable et petits problèmes

Résolu
kokojavafr Messages postés 23 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 12 septembre 2005 - 27 juil. 2005 à 11:22
jpbodiong Messages postés 4 Date d'inscription dimanche 17 juin 2007 Statut Membre 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 ?

4 réponses

dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
27 juil. 2005 à 16:20
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...
3
mouzart Messages postés 161 Date d'inscription mardi 26 avril 2005 Statut Membre Dernière intervention 6 novembre 2008 4
27 juil. 2005 à 13:47
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.
0
kokojavafr Messages postés 23 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 12 septembre 2005 1
27 juil. 2005 à 16:46
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 =)
0
jpbodiong Messages postés 4 Date d'inscription dimanche 17 juin 2007 Statut Membre Dernière intervention 27 juin 2009
5 août 2007 à 18:25
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
0
Rejoignez-nous