Ajouter ligne avec moins de colonnes [JTable] [Résolu]

Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
- - Dernière réponse : profiter
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
- 22 déc. 2011 à 12:33
bonjour
je pense que le titre montre le question
j'ai un tableau qui contient 2 lignes fixes et 2 colonnes au minimum et je demande a l'utilisateur avec un bouton s'il veut ajouter une ou des colonnes alors je l'ai ajoute
le probleme c'est que je veux que lorsqu'il arrive a un nombre bien determiné de colonnes : 18
dans ce cas quand il clique pour ajouter une colonne on revient al la ligne et on ajoute 3 lignes avec une colonne et pas 3 lignes avec le nombre de colonne de la table (comme le cas par defaut )
je souhaite que j'ai bien expliqué le probleme
franchemant je n'ai pas essayé car je sais pas d'abord est ce que c'est possible
et je n'ai meme pas une idée


merci
Afficher la suite 

Votre réponse

20/21 réponses

Meilleure réponse
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
3
Merci
Bonjour,

Non, ce n'est pas possible directement.

Par contre, au lieu d'ajouter une nouvelle ligne, tu peux créer une nouvelle table avec un nombre de colonnes qui est différent et la placer sous la première table, pour l'utilisateur, il n'y aura qu'une seule table.

Merci cs_Julien39 3

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

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
tu as raison
c'est une bonne idée
si ce n'ai pas possible c'est le seul choix qui reste
Commenter la réponse de profiter
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Non, il y a d'autres possibilités, mais c'est la plus simple.

Tu peux également faire un renderer qui grise et rend inéditables certaines cellules mais cette solution est plus complexe à mettre en œuvre.

Tu peux également recoder un JTable
Commenter la réponse de cs_Julien39
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
exactement la premiere reste la plus simple
puisque c'est le meme resultat en fin de compte
Commenter la réponse de profiter
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Oui, en effet, je te conseille néanmoins d'isoler ce composant pour pouvoir le modifier sans impacter le programme.

Bon courage

a+
Commenter la réponse de cs_Julien39
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
maitenant lorsque j'ai mis la creation d'une nouvelle table lorsque la condition est satisfaite alors rien ne s'ajoute voila le code de l'action :
ajouter_colonne.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(tab.getColumnCount() >= 7){

Object[][] contenu = new Object[3][2];
contenu[0][0] = new String("");
contenu[0][0] = new String("");
contenu[1][0] = new String("variable : 11");
contenu[2][0] = new String("variable : 22");
contenu[1][1] = new Double(0);
contenu[2][1] = new Double(0);
Object[] entete = new Object[2];
entete[0] = "g";
entete[1] = "sdcv";


MyModel mm2 = new MyModel(contenu,entete);
JTable tab2 = new JTable(mm2);
aa.add(tab2);
System.out.println("suis je");
aa.setVisible(true);

}else{
Object[] tmp = new Object[2];
tmp[0] = new Double(0);
tmp[1] = new Double(0);

((MyModel) tab.getModel()).setColumnCount(tab.getColumnCount());
((MyModel) tab.getModel()).addColumn("",tmp);
}

}
});

mais le system.out..... s'affiche ds la console ca veut dire il entre ds le if
et voila la declaration de la premiere table dans un extrait de code :
contenu_table = new Object[lignes][colonnes];
entete = new String[colonnes];
for(int i = 0; i< lignes ; i++){
contenu_table[i][0] = new String("variable"+i);
for(int  j = 1 ;j<colonnes; j++){
contenu_table[i][j] = new Double(0);
}

}
for(int j = 0; j<colonnes; j++){
entete[j] = "";
}
mm = new MyModel(contenu_table,entete);
tab = new JTable(mm);
tab.setRowHeight(20);
tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

RendererDecorator renderer = new RendererDecorator();
renderer.setAlternerLignes(true);
renderer.setBackground1(Color.CYAN);
//renderer.setBackground2(Color.GREEN);
renderer.setBackgroundSelection(Color.GREEN);

tab.setDefaultRenderer(Object.class, renderer);
tab.setColumnSelectionAllowed(true);
tab.setRowSelectionAllowed(true);

aa = new JPanel();
aa.add(tab);

JScrollPane scrollPane = new JScrollPane(aa);
getContentPane().add(scrollPane, BorderLayout.CENTER);

et l'ajout de colonne ds la premiere table marche bien
le probleme c'est lorsque la condition est satisfaite

merci
Commenter la réponse de profiter
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Je ne sais pas ce qu'est aa (d'ailleurs, on a vu mieux comme nom) mais je pense que tu devrais faire un repaint et peut être un validate pour que les modifs soient effectuées.
Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
C'est pas génial ce que tu fais, attend, je te fais un code
Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Non, désolé, je n'ai plus le temps de le faire ce soir, je vais te dire ce que j'aurais fait :

Une classe Table qui contient une arrayList de JTable et qui étend JPanel.

Su fais un setLayout(new GridLayout(tables.size(), 0)) et une méthode addRow qui créé à chaque fois une nouvelle JTable.


En même temps, je me dis que ce n'est pas forcément génial comme fonctionnement, je ne comprend pas pourquoi une colonne sans données te poses problème ?? Es tu certain que ce fonctionnement est indispensable ?
Commenter la réponse de cs_Julien39
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
aa : c'est un JPanel ou je mets dedans mon jtable pour que le jtable soit centré
avant de le faire le jtable se situait a gauche dans le conteneur du JFrame

alors j'ai trouvé comment afficher voila le nouveau action
mais il m'affiche lenouveau table a coté de l'ancien pas au dessous et il laisse un peu d'espace avant de placer
je veux qu'il se place au dessous et directemnt sous la premier colonne du premier jtable
je sais pas ce qu'il faut que je fais

merci
Commenter la réponse de profiter
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
ne classe Table qui contient une arrayList de JTable et qui étend JPanel.

Su fais un setLayout(new GridLayout(tables.size(), 0)) et une méthode addRow qui créé à chaque fois une nouvelle JTable.

ok merci pour l'idée je vais essayer de l'implementer

merci infiniment julien39

c'est tres gentil de ta part
Commenter la réponse de profiter
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
voila a quoi je suis arrivé :
package regression;

import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.JTable;

public class table extends JPanel{

/**
 * 
 */
private static final long serialVersionUID = 1L;
ArrayList<JTable> tabs;
int nbcols;
MyModel mm ;

table(int nb_cols){

this.nbcols = nb_cols ;

Object[][] contenu_table = new Object[2][nbcols];
Object[] entete = new String[nbcols];
for(int i = 0; i< 2 ; i++){
contenu_table[i][0] = new String("variable"+i);
for(int  j = 1 ;j<nbcols; j++){
contenu_table[i][j] = new Double(0);
}

}
for(int j = 0; j<nbcols; j++){
entete[j] = "";
}

mm = new MyModel(contenu_table,entete);
JTable tab = new JTable(mm);
tab.setRowHeight(20);
tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


RendererDecorator renderer = new RendererDecorator();
renderer.setAlternerLignes(true);
renderer.setBackground1(Color.CYAN);
//renderer.setBackground2(Color.GREEN);
renderer.setBackgroundSelection(Color.GREEN);

tab.setDefaultRenderer(Object.class, renderer);
tab.setColumnSelectionAllowed(true);
tab.setRowSelectionAllowed(true);

tabs =new ArrayList<JTable>();

tabs.add(tab);
add(tab);

setLayout(new GridLayout(tabs.size(),0));


}
public void addTable(){
int a = tabs.size();
if(tabs.get(tabs.size()-1).getColumnCount() == 10){
Object[][] contenu_table = new Object[3][2];
//contenu
for(int i = 1; i< 3 ; i++){
contenu_table[i][0] = new String("variable"+i);

contenu_table[i][1] = new Double(0);


}
Object[] entete = {"fsdfcvd","qdsfsfvd"};
MyModel mm = new MyModel(contenu_table,entete);
JTable tab = new JTable(mm);
tabs.add(tab);
for(int i = 0 ;i< tabs.size();i++ ){
add(tabs.get(i));
}
setLayout(new GridLayout(tabs.size(),0));
//this.repaint();
this.validate();
}else{
Object[] tmp = new Object[2];
tmp[0] = new Double(0);
tmp[1] = new Double(0);

((MyModel) tabs.get(tabs.size()-1).getModel()).setColumnCount(tabs.get(tabs.size()-1).getColumnCount());
((MyModel) tabs.get(tabs.size()-1).getModel()).addColumn("",tmp);

}

//this.setVisible(true);
}


}
Commenter la réponse de profiter
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
ca marché mais plusieurs problemes,
dans le scrollpane, avec le gridlayout(tabs.size(),0) il me divise l'espace en deux : alors que il doit etre juste au dessous .....
aussi lorsque la table de dessous vient d'etre ajouté les 2 petites colonnes qui contient s'elargit et prend toute la largeur qui correspond a 10 colonnes du premier table

pour remedier a ces problemes je pense que l'autre idée sera plus efficasse

qu'est ce vous en pensez


merci
Commenter la réponse de profiter
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
je suis en attente
aucune idée
Commenter la réponse de profiter
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Et l'autre idée, c'est quoi ?
Commenter la réponse de cs_Julien39
Messages postés
211
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
15 mars 2013
0
Merci
c'est toi qui me la cité : il s'agit d'ajouter des lignes aux meme largeurs des colonnes (le cas par defaut) et de pas afficher les colonnes dont nous n'avons pas besoins


mais
dans le scrollpane, avec le gridlayout(tabs.size(),0) il me divise l'espace en deux : alors que il doit etre juste au dessous .....
aussi lorsque la table de dessous vient d'etre ajouté les 2 petites colonnes qui contient s'elargit et prend toute la largeur qui correspond a 10 colonnes du premier table

tu n'a aucune idée pour remedier a ces problemes

merci bien
Commenter la réponse de profiter
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Alors attend, je te fais ca
Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Voilà un renderer qui te permettra de faire ce que tu veux :

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;


public class TableRenderer implements TableCellRenderer {

private DefaultTableCellRenderer support = new DefaultTableCellRenderer();

public Component getTableCellRendererComponent(JTable table, Object value, 
boolean isSelected, boolean hasFocus, int row, int column) {
Component c = support.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Table t = (Table)table;
if(t.isActif(row, column)){
if(!isSelected){
c.setBackground(Color.WHITE);
}
else{
c.setBackground(Color.CYAN);
}
}
else{
c.setBackground(Color.LIGHT_GRAY);
}
return c;
}

}

Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Le renderer ne suffira pas, il te faut également la classe Table désolé :

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;


public class Table extends JTable {

private List taillesLignes;
private int maxColonnes;

public Table(int maxColonnes) {
super(new DefaultTableModel(0, maxColonnes));
taillesLignes=new ArrayList();
setDefaultRenderer(Object.class, new TableRenderer());
}

public void addLigne(Object[] data){
List<Object> donnees = new ArrayList<Object>();
for(int i=0; i<data.length; i++){
donnees.add(data[i]);
}
for(int i=data.length; i<maxColonnes; i++){
donnees.add("");
}
taillesLignes.add(data.length);
((DefaultTableModel)getModel()).addRow(donnees.toArray());
}

public boolean isActif(int row, int column){
return taillesLignes.get(row)>=column;
}

public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setLocationRelativeTo(null);
Table table = new Table(5);
table.addLigne(new Object[]{"1", "2", "3"});
table.addLigne(new Object[]{"1", "2"});
table.addLigne(new Object[]{"1"});
table.addLigne(new Object[]{"1", "2", "3"});
f.add(table);
f.setVisible(true);
}



}

Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
C'est surement à travailler encore un peu, il faudrait bidouiller le modèle pour que les cellules grises ne soient pas éditables, mais le plus gros est fait.
Commenter la réponse de cs_Julien39

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.