IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

jtable multiligne avec textearea


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Par défaut jtable multiligne avec textearea
    Bonjour,
    dans le cas qui me pose problème je crée une table avec :
    période lundi mardi mercredi jeudi vendredi samedi dimanche
    matin
    midi
    soir

    ensuite je vais remplir les cases vides lundi matin par exemple avec du code.
    Je voudrais quand je remplis ces cases pouvoir faire un retour à la ligne avec un \n dans la case si je le souhaite.
    j'utilise le code ci-dessous pour récupérer la table lundi mardi etc. vierge via une requete sql :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    public JTable JtableRecordset()
    	{
     
    			try
    			{			
    				//récupère les informations de connexions à la base de donnée
    				VariablesGlobales vcon = new VariablesGlobales();
     
    				Class.forName(vcon.driverName);		
    				Connection con = DriverManager.getConnection(vcon.url, vcon.userName, vcon.password);
     
    				//String sql = "select NOM,DESIGNATION,PRIX from COMPOSANTS"; 
    				//String sql = "select * from COMPOSANTS"; 
     
    				//deux cas de figure  : on met les champ,table ou lar equete sql directement 
    				String sql="";
     
    				if (this.srequete == "")
    					{				
    					sql = "Select " + schamps + " from " + stable;
    					}
    				else
    					{
    						sql = srequete;
    					}
     
    				PreparedStatement ps = con.prepareStatement(sql);
    		        ResultSet rs = ps.executeQuery();
     
     
    		        //Récuperation des noms des colones
    		        ResultSetMetaData rsmetadata;
    		        rsmetadata = rs.getMetaData();
    		        int itaille = rsmetadata.getColumnCount();
    		        String columnNames []  = new String[itaille];
    		        String rowcontent []  = new String[itaille];
    		        String sentete="";
     
    //test
    		        //column.setCellRenderer(new TextAreaTableCellRenderer());  
    	            //column.setPreferredWidth(300) ;  
     
     
    		        int j =1;
     
    		        while(j !=rsmetadata.getColumnCount()+1)
    		        {
    		        	//le tableau commence à 0 alors que le rsmetadat  1...
    		        	columnNames [j-1]	= rsmetadata.getColumnName(j);
    		        	//System.out.println(rsmetadata.getColumnName(j)); 
    		        	//récupération des valeurs pour la requete
    		        	if (j==1)
    		        	{
    		        		sentete = sentete + rsmetadata.getColumnName(j);
    		        	}
    		        	else
    		        	{
    		        		sentete = sentete + "," + rsmetadata.getColumnName(j);	
    		        	}
     
    		        	j++;
    		        }
    		       // System.out.println(sentete);
     
    		        //ajout du nom des colones dans le modèle
     
    		        //au lieu d'uiliser le modele par defaut ligne ci dessous qui permet de modifier le contenu des cellules
    				//DefaultTableModel model = new DefaultTableModel();
    		        //j'utilise une version personnalisé qui ne permet pas la modification du contenu des cellules
    				ModelTable model = new ModelTable();
     
    				model.setColumnIdentifiers(columnNames);
    				table = new JTable();
    				table.setModel(model);		
    				table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    				//empecher la selection de plusieur ligne
    				table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    				//permet de ne pas avoir la ligne bleue quad on selectionne une ligne
    				//table.setSelectionBackground(Color.white);
     
    				//table.enableInputMethods(false);;
     
    				table.setFillsViewportHeight(true);
     
    				/*//multiligne?
    	    		MultiLineCellEditor editor = new MultiLineCellEditor(table);
    	    		table.setDefaultEditor(String.class,editor);*/
     
    				JScrollPane scroll = new JScrollPane(table);
    				scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    				scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);		
     
    		        int i =0;
     
    		        while (rs.next()) {
    					// for each row in the result set, put every column into a temporary Object array
     
    			        j=1;
    		        	while(j !=rsmetadata.getColumnCount()+1)
    			        {
     
    		        		rowcontent[j-1]	= rs.getString(rsmetadata.getColumnName(j));
    		        		//System.out.println(rowcontent[j-1]);
    			        	j++;
     
    			        }
    		        	model.addRow(rowcontent);
     
    					i++;				
    				}
     
    		        //affiche le nombre d'enregistrement trouvé
    				if(i <1)
    				{
    					//JOptionPane.showMessageDialog(null, "No Record Found","Error",JOptionPane.ERROR_MESSAGE);
    				}
    				if(i ==1)
    				{
    				//System.out.println(i+" Record Found");
    				}
    				else
    				{
    					//System.out.println(i+" Records Found");
    				}
     
    				//cloture de la connexion
    			    try {con.close();}
    			    catch(SQLException e) {e.printStackTrace();}
     
     
    			}
    			catch(Exception ex)
    			{
    				JOptionPane.showMessageDialog(null, ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
    			}
     
    			return table;
     
    		}

    ensuite j'affiche le résultat avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    	public void GenerateTable()
    	{
    		JScrollPane scroll = new JScrollPane(table);
    		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);	
     
     
    		JtableRecordset test = new JtableRecordset(srequete);
     
    		table = new JTable();
    		//MyTableCellEditor
     
     
    		table = test.JtableRecordset();
    		//permet de trier les enregistrements
    		table.setAutoCreateRowSorter(true);
    		//ajout du code permettant le filtrage du tableau
    		sorter = new TableRowSorter<TableModel>(table.getModel());
            table.setRowSorter(sorter);
     
     
    	}
    j'ai vu un exemple qui marche pour afficher plusieurs ligne mais sans lien avec une bdd et je n'arrive pas à l'adapter à mon code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        		JFrame f = new JFrame();
     
    				    	    DefaultTableModel dm = new DefaultTableModel() {
    				    	      public Class getColumnClass(int columnIndex) {
    				    	        return String.class;
    				    	      }
    				    	    };
     
    				    	    dm.setDataVector(new Object[][]{{"MATIN","","","","","","",""}},//"aa\na","bb","cc"}},
    				    	                     new Object[]{"PERIODE","LUNDI","MARDI","MERCREDI","JEUDI","VENDREDI","SAMEDI","DIMANCHE"});
     
    				    	    JTable table = new JTable( dm );
    				    		MultiLineCellEditor editor = new MultiLineCellEditor(table);
    				    		table.setDefaultEditor(String.class,editor);
     
    				    	    JScrollPane scroll = new JScrollPane( table );
    				    	    f.getContentPane().add( scroll );
    				    	    f.setSize( 400, 400 );
    				    	    f.setVisible(true);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    package menus;
     
    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import javax.swing.*;
     
     
    public class MultiLineCellEditor extends AbstractCellEditor implements TableCellEditor {
     
      MyTextArea textArea;
    	JTable table;
     
    	public MultiLineCellEditor(JTable ta) {
    		super();
    		table = ta;
    		// this component relies on having this renderer for the String class
    		MultiLineCellRenderer renderer = new MultiLineCellRenderer();
    		table.setDefaultRenderer(String.class,renderer);
    //                JOptionPane.showMessageDialog(null,"jui ds l'editor","h",JOptionPane.INFORMATION_MESSAGE);
    		textArea = new MyTextArea();
    		textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
    		for(int i=0;i<table.getRowCount();i++) updateRow(i);
    	}
     
    	/** This method determines the height in pixel of a cell given the text it contains */
    	private int cellHeight(int row,int col) {
    		if (row == table.getEditingRow() && col == table.getEditingColumn())
    		  return textArea.getPreferredSize().height;
    	  else
    		  return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table,
    			  table.getModel().getValueAt(row,col),false,false,row,col).getPreferredSize().height;
    	}
     
    	void cellGrewEvent(int row,int column) {
    		updateRow(row);
    	}
     
    	void cellShrankEvent(int row,int column) {
    		updateRow(row);
    	}
     
    	void updateRow(int row) {
    		int maxHeight = 0;
    		for(int j=0;j<table.getColumnCount();j++) {
    			int ch;
    			if ((ch = cellHeight(row,j)) > maxHeight) {
    			  maxHeight = ch;
    			}
    		}
    		table.setRowHeight(row,maxHeight);
    	}
     
    	public Object getCellEditorValue() {
    		return textArea.getText();
      }
     
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
    						int row, int column) {
    		textArea.setText(table.getValueAt(row,column).toString());
    		textArea.rowEditing = row;
    		textArea.columnEditing = column;
    		textArea.lastPreferredHeight = textArea.getPreferredSize().height;
    		return textArea;
    	}
     
    	class MyTextArea extends JTextArea implements KeyListener {
    		int lastPreferredHeight = 0;
    		int rowEditing;
    		int columnEditing;
     
    		MyTextArea() {
    			addKeyListener(this);
    			// This is a fix to Bug Id 4256006
    			addAncestorListener( new AncestorListener(){
    				public void ancestorAdded(AncestorEvent e){
    				  requestFocus();
    			  }
    			  public void ancestorMoved(AncestorEvent e){}
    			  public void ancestorRemoved(AncestorEvent e){}
    			});
    		}
     
    		public void keyPressed(KeyEvent e) {}
    		public void keyReleased(KeyEvent e) {}
    		public void keyTyped(KeyEvent e) {
    			if (getPreferredSize().getHeight() > lastPreferredHeight) {
    				lastPreferredHeight = getPreferredSize().height;
    				cellGrewEvent(rowEditing,columnEditing);
    				// this will trigger the addition of extra lines upon the cell growing and
    				// prevent all the text being lost when the cell grows to the point of requiring
    				// scrollbars
    				table.setValueAt(getText(),rowEditing,columnEditing);
    			}
    			else if (getPreferredSize().getHeight() < lastPreferredHeight) {
    				lastPreferredHeight = getPreferredSize().height;
    				cellShrankEvent(rowEditing,columnEditing);
    			}
    			else if (table.getValueAt(rowEditing,columnEditing).equals(""))
    				table.setValueAt(getText(),rowEditing,columnEditing);
     
    	  }
    	}
    }
    si quelqu'un a déjà eu ce type de problème, je suis preneur de son aide
    Merci,
    Fabrice

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Par défaut pas d'amateurs?
    Bon je vois que mon sujet ne soulève pas les foules
    Si quelqu'un a une piste je suis toujours preneur car je bloque un peu beaucoup sur ce point.
    Merci.

  3. #3
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut peux-tu nous afficher ce que tu as maintenant comme Vue et nous dire ce que tu aimerais comme Vue?

    Eric

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Par défaut ci -dessous la vue actuelle
    Ci dessous la vue actuelle


    Nom : table.png
Affichages : 926
Taille : 17,7 Ko


    Ce que je veux c'est avoir dans chaque cellules des retour à la ligne.

    Par exemple :
    Croissantorange
    devient
    croissant
    orange
    dans la même cellule

    j'ajoute le contenu case par case je peux donc rajouter des /n ou autre chose pour indiquer un retour à la ligne mais la jtable ne semble pas tenir compte des commandes.
    sur des forums j'ai vu qu'il fallait adapter sa jtable pour qu'elle utilise un jtextarea mais je n'arrive pas à adapter les exemples que j'ai vu mon code.

    Merci

    Fabrice

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    Citation Envoyé par merlin1977 Voir le message
    Ci dessous la vue actuelle


    Nom : table.png
Affichages : 926
Taille : 17,7 Ko


    Ce que je veux c'est avoir dans chaque cellules des retour à la ligne.

    Par exemple :
    Croissantorange
    devient
    croissant
    orange
    dans la même cellule

    j'ajoute le contenu case par case je peux donc rajouter des /n ou autre chose pour indiquer un retour à la ligne mais la jtable ne semble pas tenir compte des commandes.
    sur des forums j'ai vu qu'il fallait adapter sa jtable pour qu'elle utilise un jtextarea mais je n'arrive pas à adapter les exemples que j'ai vu mon code.

    Merci

    Fabrice
    Bonjour,

    pour ma par j'ai réalisé cela avec un JLabel et du HTML. l'exemple que tu as suivi avec un JTextArea c'était surtout pour éditer.
    Donc soit un texte contenant des "\n" voici comment je fais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String texteAvecRetourCharriot = <le texte à afficher>;
    String memeTexteHTML = texteAvecRetourCharriot.replace("\n","<br>");
    JLabel label.setText("<html>"+memeTexteHTML+"</html>";
    return label;
    Ceci peut être mis par exemple dans un renderer spécifique avec agrandissement de la ligne pour que tout soit visible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public class MultiLignesRenderer extends DefaultTableCellRenderer
    {
           	private Font police = getFont();
    	private FontMetrics fm = getFontMetrics(police);
    	private int hauteurLigne = fm.getHeight();
     
     
    	public Component getTableCellRendererComponent(JTable table, Object value,
                								boolean isSelected, boolean hasFocus, int row, int col)
    	{
    		JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
    		int largeur = table.getColumnModel ().getColumn (col).getWidth();
    		String s = ((String) value).replace("\n","<br>");
    		int hauteur = calculeHauteur(s, largeur,table);
    		if (hauteur > table.getRowHeight(row)) table.setRowHeight(row, hauteur);
    		label.setAlignmentY(JLabel.BOTTOM_ALIGNMENT);
    		label.setText("<html>" + s + "</html>");
    		return label;
    	}
     
    	private int calculeHauteur(String s, int largeur, JTable t)
    	{
    		String[] lignes = s.split("<br>");
    		int nbLignes = lignes.length;
    		for (String ligne : lignes)
    		{
    			nbLignes += (int) Math.floor(t.getFm().stringWidth(ligne)/largeur);
    		}
    		return nbLignes * hauteurLigne;
    	}
    }

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Par défaut Effectivent c'est une idée à creuser :)
    Bonjour,
    merci pour ton aide, effectivement ça me parait être une bonne solution à mon problème.
    Je vais tester ça demain
    Merci beaucoup pour ton exemple de code.
    Fabrice

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTable] Créer une JTable vide avec des noms de colonnes.
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 27/09/2005, 15h54
  2. [JTable] Problème avec le modèle
    Par etiennegaloup dans le forum Composants
    Réponses: 2
    Dernier message: 20/09/2005, 16h25
  3. [JTable] Problème avec la couleur de fond
    Par ellocin dans le forum Composants
    Réponses: 5
    Dernier message: 13/09/2005, 23h07
  4. [JTable] remplir avec une matrice
    Par ybdz dans le forum Composants
    Réponses: 3
    Dernier message: 08/12/2004, 21h03
  5. [JTable] Cellule avec deux boutons
    Par cherbox dans le forum Composants
    Réponses: 3
    Dernier message: 12/08/2004, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo