Augmenter la taille d'un tableau

Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour,
SVP, je veux savoir la méthode qui permet d'augmenter la taille d'un tableau appartenant à un onglet.
A voir également:

17 réponses

jeanjean_ac Messages postés 32 Statut Membre
 
Bonsoir,
Explique un peu plus : de quelle logiciel ou langage parle-tu ?
0
Utilisateur anonyme
 
je parle du langage java et du logiciel Eclipse.
0
jeanjean_ac Messages postés 32 Statut Membre
 
Tu parle d'une ArrayList ? Dans ce cas c'est la méthode add.

Ou alors tu parle d'un onglet dans eclipse ?
0
Utilisateur anonyme
 
Salut,

La taille d'un tableau est définitive...
On ne peut donc pas la changer.

La solution est l'utilisation de la classe ArrayList (import java.util.ArrayList;)

https://docs.oracle.com/javase/6/docs/api/

et selectionner la classe ArrayList.

À défaut on peut toujours créer un nouveau tableau plus grand et copier les éléments du tableau trop petit + les éléments nouveaux mais bon !!!
(ou plutôt à quoi bon puisque ArrayList existe et depuis java 1.2.)

Cordialement,

Dan
0

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

Posez votre question
Utilisateur anonyme
 
Salut,
SVP comment je pourrais utiliser la classe ArrayList pour augmenter la taille de mon tableau car je n'arrive pas à l'afficher
0
KX Messages postés 19031 Statut Modérateur 3 020
 
La taille du "tableau" dans une ArrayList est augmenté automatiquement, tu n'as pas vraiment à t'en soucier. Il te suffit d'ajouter des éléments avec add et c'est bon.
Au besoin tu peux te servir de ensureCapacity mais tu ne devrais pas en avoir besoin.

Pour l'affichage une simple boucle suffit :

for (Object o : liste)
    System.out.println(o);

Si on savait ce que tu essaye de faire exactement avec ton tableau, on pourrait te diriger vers la solution la plus appropriée à ton problème (vrai tableau, ArrayList, ou autre...)
0
Utilisateur anonyme
 
Re,

La classe ArrayList ne te permettra pas d'augmenter la taille de ton tableau mais de créer et utiliser un type de tableau (similaire à un tableau classique) de manière plus pratique et surtout sans te préoccuper de la capacité.

Mais il faut que tu consulte la doc concernant la classe ArrayList.

Voici une petite démo qui te montrera une partie de ce qu'on peut faire:


import java.util.ArrayList;

   public class ArrayListDemo
   {
      public static void main(String[] args)
      {
         ArrayList<Object> arrL = new ArrayList<Object>();
         
         ArrayList<String> t3 = new ArrayList<String>(); 
    	
         t3.add ("Bonjour");
         t3.add ("Salut");
         t3.add ("xyz");
         t3.add ("salut");
         t3.add ("Salut");
      
      	
         System.out.println("\nContenu de t3: " + t3);
         //ou bien comme un tableau "classique":
         if(t3.size() >0) // noter .size() et non .length()
         {
            for(int i=0;i<t3.size();i++)
            {
               System.out.println("item " + i + ": " + t3.get(i) + "\n");
            }
         }
         else System.out.println("t3 est vide !!!...");
         
         
         Integer i1 = new Integer(10);
         Integer i2 = new Integer(20);
         Integer i3 = new Integer(30);
         Integer i4 = new Integer(40);
         String str = "Salut";
         
         System.out.println("\nContenu initial de arrL: " + arrL);
         System.out.println("Taille de arrL: " + arrL.size() + "\n");
         
         System.out.println("On ajoute les 3 premiers items:\n"
            + "-i1: " + i1 + "\n"
            + "-i2: " + i2 + "\n"
            + "-str: \"" + str + "\"");
         
      	//ajout des 3 élements
      	
         arrL.add(i1);
         arrL.add(i2);
         arrL.add(str);
         
         System.out.println("\nNouveau contenu de arrL: " + arrL);
         System.out.println("Taille de arrL: " + arrL.size() + "\n");
      
      	//ajout de 6 élements dont un nouveau (i5) et encore (str)
         arrL.add(i1);
         arrL.add(i2);
         arrL.add(i3);
         arrL.add(i4);
         Integer i5 = new Integer(50);
         arrL.add(i5);
         arrL.add(str);
         
         System.out.println("On ajoute 6 items dont 2 nouveaux (i5) et encore (str):\n"
            + "-i1: " + i1 + "\n"
            + "-i2: " + i2 + "\n"
            + "-i3: " + i3 + "\n"
            + "-i4: " + i4 + "\n"
            + "-i5: " + i5 + "\n"
            + "-str: " + str + "\n");
         
         System.out.println("Nouveau contenu de arrL: " + arrL);
         System.out.println("Nouvelle taille de arrL: " + arrL.size() + "\n");
         
      	// L'autre maniere de lister le contenu de l'ArrayList arrL
      	
         System.out.println("Autre maniere de lister le contenu de l'ArrayList arrL:\n");
         for(int i=0;i<arrL.size();i++)
         {
            System.out.println("item " + i + ": " + arrL.get(i) + "\n");
         }
         
      	// Obtenir l'indice d'un item de l'ArrayList arrL
      	
         boolean trouve = false;
         Object obj;
      	
         obj = "Salut";
      // obj = 10;
         int i = 0;
         System.out.println("On recherche l'objet " + obj + ":");
         for(i=0;i<arrL.size();i++)
         {
            if(arrL.get(i).equals(obj))
            {
               System.out.println("item " + i + ": " + arrL.get(i) + ".");
               trouve = true;
            }
         }
         System.out.println("");
         if(!trouve)
            System.out.println("L'objet " + obj + " n'existe pas...\n");
      
         // Clonage de arrL avant suppression d'un élément
         Object arrLClone = arrL.clone();
         
         System.out.println("On clone arrL sous le nom arrLClone (save avant remove):");
      	  
         System.out.println("Le clone (arrLClone) de arrL est: " + arrLClone + "\n");
      
      	// Suppression  de l'élément 2 
         arrL.remove(2);
      
         System.out.println("On supprime l'item 2 de arrL:");
        
         System.out.println("Nouveau contenu de arrL: " + arrL);
         System.out.println("Nouvelle taille de arrL: " + arrL.size() + "\n");      
      }
   }

Cordialement,

Dan
0
Utilisateur anonyme
 
Salut,
Je cherche juste à savoir comment afficher mon tableau sur toute la surface de l'onglet tout en sachant que l'onglet contient un seul tableau.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Ton onglet c'est quoi ? Tu parles de bibliothèques graphiques ? AWT, Swing ? Quand on parle de tableau en Java c'est des trucs du genre Object[] tab, toi tu parles de quoi ? d'un JTable ?

Est-ce qu'on est vraiment obligé d'avoir à deviner ce que tu veux pour te répondre ? Pose une question claire et précise, et on te donnera la réponse adaptée ! Et si tu as un début de code donne le nous qu'on l'adapte directement pour répondre à ton problème.
0
Utilisateur anonyme
 
Salut,
je parle de la bibliothèque graphique SWING et du tableau JTable
Je cherche juste à savoir comment afficher mes 2 tableaux (tableau1 et tableau2)sur toute la surface du panneau jp2 et jp3
voila le code

import java.awt.BorderLayout;


import java.awt.Color;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.List;

import java.awt.Container;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class projet extends JFrame implements ActionListener {

//créer un bouton
private JButton jb=new JButton("OK");
//Les titres des colonnes du tableau1
String title1[] = {"1", "2", "3","4","5","6"};
//Les données du tableau1
Object[][] data1 ={};
//
private DefaultTableModel model1;
private JTable tableau1;

//Les titres des colonnes du tableau2
String title2[] = {"1", "2", "3","4"};
//Les données du tableau2
Object[][] data2 ={};
//
private DefaultTableModel model2;
private JTable tableau2;
//
private JTabbedPane tabPane;

public projet(){
//créer le premier tableau
model1=new DefaultTableModel(data1, title1);
tableau1 = new JTable(model1);
//créer le deuxième tableau
model2=new DefaultTableModel(data2, title2);
tableau2 = new JTable(model2);
//créer le conteneur cp
Container cp=this.getContentPane();
//créer les paneaux jp1, jp2 et jp3
JPanel jp1=new JPanel();
JPanel jp2=new JPanel();
JPanel jp3=new JPanel();
//Créer le conteneur d'onglets
tabPane= new JTabbedPane();
//ajouter jl au paneau jp1
jp1.add(jb);
//ajouter le tableau tableau1 et tableau2 au contentPane dans un scroll
//Sinon les titres des colonnes ne s'afficheront pas ! !
jp2.add(new JScrollPane(tableau1));
jp3.add(new JScrollPane(tableau2));
//ajouter les paneaux jp1, jp2 et jp3 au conteneur cp
cp.add(jp1);
cp.add(jp2);
cp.add(jp3);
//ajouter les onglets
tabPane.addTab("onglet1", jp1);
tabPane.addTab("onglet2", jp2);
tabPane.addTab("onglet3", jp3);
//passer les onglets au contentPane
this.getContentPane().add(tabPane);
//définir les couleurs de l'arrière plan du paneau
jp2.setBackground(Color.GRAY);
jp3.setBackground(Color.GRAY);
//définir le titre de la fentre
this.setTitle("Une application");
//rendre la fenetre visible
this.setVisible(true);
//quitter l'application
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//agrandir l'interface au maximum
setExtendedState(MAXIMIZED_BOTH);
//Pour qu'il n'y ai qu'une seule ligne de selectionnable à la fois
tableau1.setSelectionMode(1);
//modifier la hauteur de la ligne
tableau1.setRowHeight(20);
//Pour ne pas qu'elle s'auto reduise
tableau1.setAutoResizeMode(0);
//Barre de titre
tableau1.setTableHeader(null);
//agrandir les colonnes du tableau1
tableau1.getColumnModel().getColumn(0).setPreferredWidth(300);
tableau1.getColumnModel().getColumn(1).setPreferredWidth(300);
tableau1.getColumnModel().getColumn(2).setPreferredWidth(300);
tableau1.getColumnModel().getColumn(3).setPreferredWidth(300);
tableau1.getColumnModel().getColumn(4).setPreferredWidth(300);
tableau1.getColumnModel().getColumn(5).setPreferredWidth(300);
//Pour qu'il n'y ai qu'une seule ligne de selectionnable à la fois
tableau2.setSelectionMode(1);
//modifier la hauteur de la ligne
tableau2.setRowHeight(20);
//Pour ne pas qu'elle s'auto reduise
tableau2.setAutoResizeMode(0);
//Barre de titre
tableau2.setTableHeader(null);
//agrandir les colonnes du tableau1
tableau2.getColumnModel().getColumn(0).setPreferredWidth(300);
tableau2.getColumnModel().getColumn(1).setPreferredWidth(300);
tableau2.getColumnModel().getColumn(2).setPreferredWidth(300);
tableau2.getColumnModel().getColumn(3).setPreferredWidth(300);
//exécuter la méthode ActionListonner en cliquant sur le bouton
jb.addActionListener(this);

}
public static void main(String[] args) {
new projet();
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}
}
0
Utilisateur anonyme
 
Voila ce qu'il se passe quand on appelle pas un chat un chat, un tableau un tableau et une JTable une ... table.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
J'ai fait pas mal de ménage dans ton code parce que ça me piquait les yeux...
L'astuce pour résoudre ton problème c'est d'utiliser setFillsViewPortHeight(true) combiné avec setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS) avec un Layout adapté.

Remarque : ce n'est pas le conteneur (la JFrame) qui doit implémenter ActionListener, mais le composant lié à l'action (le JButton)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;

public class Projet extends JFrame
{
	private static final long serialVersionUID = 1;

	private final JButton bouton;
	
	private final JTable table1;
	private final JTable table2;

	private final JTabbedPane tabPane;
	
	public Projet()
	{		
		// Onglet 1
		////////////
		
		JPanel jp1=new JPanel();
		
		bouton = new JButton("OK");
		bouton.addActionListener(new ActionListener () 
        { 
            @Override 
            public void actionPerformed(ActionEvent e) 
            {
                JOptionPane.showMessageDialog(null,"OK !!!"); // TODO
            } 
        });
		
		jp1.add(bouton);
		
		// Onglet 2
		////////////
		
		JPanel jp2=new JPanel();
		jp2.setLayout(new BorderLayout());
		jp2.setBackground(Color.GRAY);
		
		table1 = formaterTable("1","2","3","4","5","6");
		
		jp2.add(new JScrollPane(table1));
		
		// Onglet 3
		////////////
		
		JPanel jp3=new JPanel();
		jp3.setLayout(new BorderLayout());
		jp3.setBackground(Color.GRAY);
		
		table2 = formaterTable("1","2","3","4");
		
		jp3.add(new JScrollPane(table2));
		
		// Onglets
		///////////
		
		tabPane = new JTabbedPane();
		
		tabPane.addTab("onglet1", jp1);
		tabPane.addTab("onglet2", jp2);
		tabPane.addTab("onglet3", jp3);

		// Application
		///////////////
		
		setTitle("Une application");
		setSize(new Dimension(400,300));
		setExtendedState(MAXIMIZED_BOTH);
		
		add(tabPane);			

		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	private JTable formaterTable(String...columnNames)
	{
		JTable table = new JTable(new Object[][] {},columnNames);
		table.setSelectionMode(1);
		table.setRowHeight(20);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		//table.setTableHeader(null);
		table.setFillsViewportHeight(true);
		return table;
	}
	
	public static void main(String[] args)
	{
		new Projet();
	}
}
0
Utilisateur anonyme
 
Salut,
Merci beaucoup pour votre réponse, en fin j'ai pu afficher les 2 tableaux (table1 et table2) sur toute la surface de jp1 et jp2 mais j'ai encore 3 soucis
je n'arrive pas à vider les champs du table1 et table2 après avoir cliquer sur le bouton Ok.
je n'arrive pas à remplir les lignes de mes 2 tableaux table1 et table2 par les colonnes des 2 tableau r1 et r2 que j'ai créeé dans la mémoire.
je n'ai pas su comment ajouter à mon application une boite de dialogue qui s'affiche quand l'utilisateur ferme l'application en lui demandant "Voulez-vous fermer l'application" avec les 2 boutons OK et Annuler.
voila le code que j'ai fait pour vider les champs
for(int i=0;i<model1.getRowCount();i++)
tablel1.removeRow(i);
for(int i=0;i<model2.getRowCount();i++)
tablel2.removeRow(i);

voila le code que j'ai fait pour remplir les 2 tableaux: table1 et table2
//parcourir le tableau r1
for(int i=0;i<t1;i++){
//remplir les lignes du tableau model1
table1.addRow(new Object []{r1[i][0],r1[i][1],r1[i][2],r1[i][3],r1[i][4],r1[i][5]});
}
//parcourir le tableau r2
for(int i=0;i<t2;i++){
//remplir les lignes du tableau model1
table2.addRow(new Object []{r2[i][0],r2[i][1],r2[i][2],r2[i][4]});
}
Merci d'avance
0
KX Messages postés 19031 Statut Modérateur 3 020
 
À défaut d'avoir ton code complet, je vais reprendre partiellement le mien :

Pour pouvoir modifier les tables tu vas devoir modifier la création des tableaux :

String r1[][] = new String[][] {...}, r2[][] = new String[][] {...};

table1 = formaterTable(r1,"1","2","3","4","5","6");
table2 = formaterTable(r2,"1","2","3","4");

private JTable formaterTable(Object[][] rowData, String...columnNames)
{
    JTable table = new JTable(new DefaultTableModel(rowData,columnNames));
    //...
}

Tu pourras également te servir de cette méthode :

private void ajouter(JTable table, Object[][] rowData)
{ 
	DefaultTableModel dtm = (DefaultTableModel) table.getModel();
	for (Object[] row : rowData)
		dtm.addRow(row);
}

Pour effacer les lignes des tables sers toi de ceci dans l'actionPerformed de OK :

private void effacer(JTable table)
{
	DefaultTableModel dtm = (DefaultTableModel) table.getModel();
	while (dtm.getRowCount()>0)
		dtm.removeRow(0);
}

Concernant la fermeture de l'application, tu dois ajouter un bouton quitter :

Button quitter = new JButton("Quitter");
quitter.addActionListener(new ActionListener () 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    {
        int n = JOptionPane.showConfirmDialog(
            null,"Voulez-vous quitter ?","Quitter",JOptionPane.YES_NO_OPTION);

        switch(n)
        {
        case JOptionPane.YES_OPTION : System.exit(0);
        case JOptionPane.NO_OPTION : break;
        case JOptionPane.CLOSED_OPTION : actionPerformed(e); break;
        }
});
0
Utilisateur anonyme
 
Salut,
merci bcp pour votre réponse
pour les 2 tableaux (table1 et table2) je veux les remplir à partir des 2 tableaux que j'ai créée dans la mémoire
voila le code que j'ai fait mais malheureusement ça n'a pas marché
//créer les 2 tableaux S et W dans la mémoire
String S[][]=new String[1000][6];
String W[][]=new String[10000][8];

for(int i=0;i<t1;i++){
table1.addRow(new Object []{S[i][0],W[i][1],W[i][2],W[i][3]});
}

for(int i=0;i<t2;i++){
table2.addRow(new Object []{W[i][0],W[i][1],W[i][2],W[i][4]});
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Evidemment que ça n'a pas marché, mais je t'ai déjà donné un code qui fait l'ajout.
En effet on ne peut pas manipuler directement les lignes des JTable, il faut passer par le Model comme je l'ai fait dans les méthodes ajouter et effacer un peu plus haut.

for(int i=0;i<t1;i++)
	ajouter(table1,new Object [][] {{S[i][0],W[i][1],W[i][2],W[i][3]}}); 

for(int i=0;i<t2;i++){ 
	ajouter(table2,new Object [][] {{W[i][0],W[i][1],W[i][2],W[i][4]}});

Tu peux également modifier légèrement la méthode ajouter, en effet la précédente était faite pour l'ajout de plusieurs lignes en même alors que toi tu veux les ajouter une à une :

private void ajouter(JTable table, Object...row)
{
	((DefaultTableModel) table.getModel()).addRow(row);
}

for(int i=0;i<t1;i++)
	ajouter(table1,S[i][0],W[i][1],W[i][2],W[i][3]);

for(int i=0;i<t2;i++){ 
	ajouter(table2,W[i][0],W[i][1],W[i][2],W[i][4]);

Remarque : table1 contient 6 colonnes, en conséquence si tu ne lui donnes que 4 objets par ligne, ça risque de planter, rajoute deux objets à la fin pour compléter ta ligne (null ou "" par exemple)
0
Utilisateur anonyme
 
Salut,
non malheureusement, ces méthodes n'ont pas marché car les tableaux restent vides.
j'ai ajouté 2 colonnes à la table1.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Est-ce que tu as rempli les tableaux S et W avant d'ajouter les S[i] et W[i] aux tables ?

Voici mon code de test de la méthode ajouter (la deuxième, celle avec Object...row en paramètre).
Cela marche très bien avec le reste du code tel que je l'avais mis ici et modifié ici et ici :

public static void main(String args[])
{
	Projet p = new Projet();
	
	/*String S[][]=new String[1000][6]; 
	String W[][]=new String[10000][8]; */

	for(int i=0;i<10;i++)
		p.ajouter(p.table1,i+1,i+2,i+3,i+4,i+5,i+6); 

	for(int i=0;i<5;i++)
		p.ajouter(p.table2,i+1,i+2,i+3,i+4);
}

Remarque : pour être tout à fait correct, les méthodes ajouter et supprimer devraient être static.
0
Utilisateur anonyme
 
Salut,
je pense que j'ai ce problème parce que j'ai ajouté la méthode formaterTable car avant de l'ajouter, j'ai pu remplir les 2 tableaux (table1 et table2) sans aucun problème
private JTable formaterTable(String...columnNames)
{
JTable table = new JTable(new Object[][] {},columnNames);
table.setSelectionMode(1);
table.setRowHeight(20);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
//table.setTableHeader(null);
//table.setFillsViewportHeight(true);
return table;

}

Voila le code que j'ai déjà mis pour les remplir et ca marché
String title1[] = {"1", "2", "3","4","5","6"};
Object[][] data1 ={};
private DefaultTableModel model1;
private JTable table1;
String title[] = {"1", "2", "3","4",};
Object[][] data2 ={};
private DefaultTableModel model2;
private JTable table2;

model1=new DefaultTableModel(data1, title1);
table1 = new JTable(model1);
model2=new DefaultTableModel(data2, title2);
table2 = new JTable(model2);

for(int i=0;i<t1;i++){
model1.addRow(new Object []{S[i][0],S[i][1],S[i][2],S[i][3],S[i][4],S[i][5]});
}
for(int i=0;i<t2;i++){
model2.addRow(new Object []{W[i][0],W[i][1],W[i][2],W[i][4]});
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
En fait l'erreur vient bien de formaterTable, en effet je l'avais modifié ici car pour accéder au modèle il faut lui définir explicitement à la création de la table :

Il ne faut pas mettre JTable table = new JTable(new Object[][] {},columnNames);
mais JTable table = new JTable(new DefaultTableModel(new Object[][] {},columnNames));

Si tu modifies juste ça, tu pourras utiliser ajouter et supprimer comme je les ai mises plus haut.
0
Utilisateur anonyme
 
Oui, ca marché merci bcp, mais le vidage des données de table1 et table2 ne se fait pas. Meme si j'ai utilisé cette méthode
private void effacer(JTable table)
{
DefaultTableModel dtm = (DefaultTableModel) table.getModel();
while (dtm.getRowCount()>0)
dtm.removeRow(0);
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Pourtant ce code marche. Par exemple avec le bouton OK :

bouton.addActionListener(new ActionListener () 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    {
    	effacer(table1);
    	effacer(table2);
        JOptionPane.showMessageDialog(null,"Effacées !!!");
    } 
});

Il ne reste alors que l'en-tête des colonnes mais c'est normal.
0
Utilisateur anonyme
 
Salut,
j'ai ajouté cette méthode ca marché merci bcp.
0