Ajouter ligne avec moins de colonnes [JTable]

Résolu
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 - 21 déc. 2011 à 13:12
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre 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

21 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 13:21
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.
3
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 14:18
tu as raison
c'est une bonne idée
si ce n'ai pas possible c'est le seul choix qui reste
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 14:45
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
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 14:53
exactement la premiere reste la plus simple
puisque c'est le meme resultat en fin de compte
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 15:32
Oui, en effet, je te conseille néanmoins d'isoler ce composant pour pouvoir le modifier sans impacter le programme.

Bon courage

a+
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 15:35
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 15:47
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.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 15:48
C'est pas génial ce que tu fais, attend, je te fais un code
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 déc. 2011 à 15:53
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 ?
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 15:59
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
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 16:02
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
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 21:14
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);
}


}
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
21 déc. 2011 à 21:30
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
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
22 déc. 2011 à 10:17
je suis en attente
aucune idée
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 déc. 2011 à 11:08
Et l'autre idée, c'est quoi ?
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
22 déc. 2011 à 11:26
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 déc. 2011 à 11:56
Alors attend, je te fais ca
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 déc. 2011 à 12:12
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;
}

}

0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 déc. 2011 à 12:13
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);
}



}

0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 déc. 2011 à 12:14
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.
0
Rejoignez-nous