Partage
  • Partager sur Facebook
  • Partager sur Twitter

Des boutons dans un JTable

ils ne font rien mes boutons...

    20 septembre 2011 à 16:57:38

    Bonjour,

    J'ai un petit programme qui scrute un répertoire contenant des fichiers son pour en extraire les ID Tags (titre, artiste...) et mettre tout ça dans un JTable. Dans la dernière colonne de ce JTable, je fais afficher un bouton "Play" qui me servira à écouter le titre de la ligne du JTable. Mon problème est que rien ne se produit quand je clique sur le bouton "Play".
    Je vous copie ci après mon code, mais c'est assez long et mon code n'est pas forcément très bien commenté (je débute et je ne suis pas encore trop à l'aise avec la pertinence des commentaires à ajouter). Merci d'avance à ceux qui me posteront des réponses constructives.

    public class Mediabase2 extends JPanel implements ActionListener{
    
    	
    
    
    	private Boolean audioFileInDirectory = new Boolean(false);
    
    	private Color colorModifiedCell = new Color(255,175,175);
    
    	@SuppressWarnings("unchecked")
    
    	private ArrayList tagsList = new ArrayList();
    
    	private String headerMetadataTable [] = {"Selection", "Fichier", "Artiste", "Titre", "Durée", "Aperçu", "Modified", "AbsolutePath"};
    
    	int indexSelection, indexFile, indexArtist, indexTitle, indexLength, indexPreListen, indexModified, indexAbsolutePath;
    
    	
    
    	private JTable metadataJTable;
    
    	private Object[][] metadataDataTable;	
    
    	private int pathLength;
    
    	
    
    	//JButton preListen = new JButton ("Play");
    
    	JButton preListen;
    
    	
    
    	/**
    
    	 * Constructeur par défaut
    
    	 */
    
    	public Mediabase2() {
    
    		System.out.println("Constructeur par défaut");
    
    	}
    
    	
    
    	/**
    
    	 * Constructeur avec précision du répertoire à scanner
    
    	 * @param directoryToScan => le répertoire à scanner
    
    	 */
    
    	public Mediabase2(File directoryToScan) {
    
    		pathLength = directoryToScan.getAbsolutePath().length();
    
    		
    
    		indexDefinition();
    
    		filesListing(directoryToScan);
    
    		if (audioFileInDirectory == true) {	
    
    			
    
    			metadataDataTable = new Object [tagsList.size()][headerMetadataTable.length];
    
    			int iTagsList = 0 , jTagsList = 0;
    
    			for (Object obj : tagsList) {
    
    				//System.out.println("***** Donnée = " + obj + " - Est un tableau = " + obj.getClass().isArray());
    
    				for (Object obj2 : (Object[]) obj) {
    
    					//System.out.println("Donnée " + iTagsList + " - " + jTagsList + " = " + obj2 + "Booleen ? " + obj2.getClass());
    
    					metadataDataTable[iTagsList][jTagsList] = obj2;
    
    					jTagsList+=1;
    
    				}
    
    				iTagsList+=1;
    
    				jTagsList = 0;
    
    			}
    
    			
    
    			MetadataTableModel metadataJTableModel = new MetadataTableModel(metadataDataTable, headerMetadataTable);
    
    			TableCellRenderer metadataJTableCellRenderer = new MetadataTableCellRenderer();
    
    			metadataJTable = new JTable(metadataJTableModel);
    
    			metadataJTable.setDefaultRenderer(JButton.class, metadataJTableCellRenderer);
    
    			metadataJTable.setDefaultRenderer(Object.class, metadataJTableCellRenderer);
    
    			metadataJTable.setAutoCreateRowSorter(true);
    
    			TableColumn column = null;
    
    			for (int i = 0 ; i< metadataJTable.getColumnCount() ; i+=1) {
    
    				column = metadataJTable.getColumnModel().getColumn(i);
    
    				if (i==indexSelection) {
    
    					column.setPreferredWidth(0);
    
    				} else if (i==indexFile) {
    
    					column.setPreferredWidth(100);
    
    				} else if (i==indexLength ) {
    
    					column.setPreferredWidth(0);
    
    				} else if (i==indexPreListen) {
    
    					column.setPreferredWidth(50);
    
    				} else if (i==indexModified) {
    
    					column.setMinWidth(0);
    
    					column.setMaxWidth(0);
    
    				} else if (i==indexAbsolutePath) {
    
    					column.setMinWidth(0);
    
    					column.setMaxWidth(0);
    
    				}
    
    			}
    
    			
    
    			this.add(new JScrollPane(metadataJTable));
    
    			
    
    			
    
    		} else {
    
    			JLabel label = new JLabel ("Pas de fichier à analyser dans le répertoire.");
    
    			this.add(label);
    
    		}
    
    
    
    	}
    
    	
    
    	public class MetadataTableModel extends AbstractTableModel {
    
    		
    
    		/**
    
    		 * 
    
    		 */
    
    		private static final long serialVersionUID = 11-05-22;
    
    		private Object [][] data;
    
    		private String [] title;
    
    		
    
    		/**
    
    		 * Constructeur du TableModel
    
    		 * @param data => le tableau des données pour le JTable
    
    		 * @param title => le tableau des intitulés des colonnes
    
    		 */
    
    		public MetadataTableModel (Object [][] data, String [] title) {
    
    			this.data = data;		
    
    			this.title = title;
    
    		}
    
    		
    
    		/**
    
    		 * Retourne le nom de la colonne du JTable
    
    		 * @param col => le numéro de la colonne
    
    		 * @return le nom de la colonne
    
    		 */
    
    		public String getColumnName(int col) {
    
    			return this.title[col];
    
    		}
    
    		
    
    
    
    		@Override
    
    		/**
    
    		 * Retourne le nombre de colonnes du JTable
    
    		 * @return le nombre de colonne du JTable
    
    		 */
    
    		public int getColumnCount() {
    
    			return this.title.length;
    
    		}
    
    
    
    		@Override
    
    		/**
    
    		 * Retourne le nombre de lignes du JTable
    
    		 * @return le nombre de lignes du JTable 
    
    		 */
    
    		public int getRowCount() {
    
    			// TODO Auto-generated method stub
    
    			return this.data.length;
    
    		}
    
    
    
    		@Override
    
    		/**
    
    		 * Retourne la valeur du JTable pour un indice de ligne et de colonne donné
    
    		 * @param rowIndex => index de la ligne
    
    		 * @param colomnIndex => index de la colonne
    
    		 * @return la valeur de l'objet
    
    		 */
    
    		public Object getValueAt(int rowIndex, int columnIndex) {
    
    			// TODO Auto-generated method stub
    
    			return this.data[rowIndex][columnIndex];
    
    		}
    
    		
    
    		/**
    
    		 * Écrit dans le JTable une valeur pour un indice de ligne et de colonne donné
    
    		 * @param value => le JTable auquel la méthode s'applique
    
    		 * @param row => l'indice de la ligne
    
    		 * @param col => l'indice de la colonne
    
    		 */
    
    		public void setValueAt(Object value, int row, int col) {
    
    			data[row][col] = value;
    
    			
    
    			if (col != indexSelection && col !=indexModified) {
    
    				data[row][indexSelection] = true;
    
    				data[row][indexModified] = true;
    
    			}
    
    			fireTableCellUpdated(row, col);
    
    		}
    
    		
    
    		@SuppressWarnings("unchecked")
    
    		/**
    
    		 * Retourne la classe d'une colonne
    
    		 * @param col => l'indice de la colonne
    
    		 * @return la classe de la colonne
    
    		 */
    
    		public Class getColumnClass (int col) {
    
    			Object value = this.getValueAt(0, col);
    
    			return (value==null?Object.class:value.getClass());
    
    		}
    
    		
    
    		/**
    
    		 * Précise quelles sont les cellules éditables pour une ligne ou une colonne donn�e
    
    		 * @param row => indice de la ligne
    
    		 * @param col => indice de la colonne
    
    		 * @return le fait que la cellule soit éditable ou non
    
    		 */
    
    		public boolean isCellEditable (int row, int col) {
    
    			if (col==indexArtist) {
    
    				return true;
    
    			} else if (col==indexTitle) {
    
    				return true;
    
    			} else if (col==indexSelection) {
    
    				return true;
    
    			} 
    
    			return false;
    
    		}
    
    		
    
    		
    
    	}
    
    	
    
    	public class MetadataTableCellRenderer extends DefaultTableCellRenderer {
    
    		/**
    
    		 * 
    
    		 */
    
    		private static final long serialVersionUID = 11-05-22;
    
    
    
    		public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasfocus, int row, int column) {
    
    			Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column);
    
    			
    
    			if ((Boolean)table.getValueAt(row, indexModified) == true) {
    
    				cell.setBackground(colorModifiedCell);
    
    			} else {
    
    				cell.setBackground(Color.WHITE);
    
    			}
    
    			
    
    			if (value instanceof JButton) {
    
    				return (JButton) value;
    
    			} else {
    
    				return this;
    
    			}
    
    				
    
    		}
    
    	}
    
    	
    
    	/**
    
    	 * private method that will list the files in the directory
    
    	 * then add the metadatas in the table of metadatas
    
    	 * if the file is an audiofile type
    
    	 * @param directory
    
    	 */
    
    	@SuppressWarnings("unchecked")
    
    	private void filesListing (File directory) {
    
    		
    
    		if (directory.isDirectory()) {
    
    			
    
    			File [] filesList = directory.listFiles();
    
    			if (filesList != null) {;
    
    				for (int i=0 ; i < filesList.length ; i+=1) {
    
    					filesListing(filesList[i]);
    
    					File fileToScan = filesList[i];
    
    					AudioFile audioFileToScan;
    
    					
    
    					try {
    
    						audioFileToScan = AudioFileIO.read(fileToScan);
    
    						Tag trackTag = audioFileToScan.getTag();
    
    						String artist = trackTag.getFirst(FieldKey.ARTIST);
    
    						String title = trackTag.getFirst(FieldKey.TITLE);
    
    						int trackLength = audioFileToScan.getAudioHeader().getTrackLength();
    
    						String trackLengthString = new String();
    
    						if (trackLength%60 < 10) {
    
    							trackLengthString =  String.valueOf(trackLength/60) + "\'0" + String.valueOf(trackLength%60) + "\"";
    
    						} else {
    
    							trackLengthString =  String.valueOf(trackLength/60) + "\'" + String.valueOf(trackLength%60) + "\"";
    
    						}
    
    						Boolean selected = new Boolean (false);
    
    						Boolean modified = new Boolean (false);
    
    						//JButton preListen = new JButton ("Play");
    
    						preListen = new JButton ("Play");
    
    						//preListen.addActionListener(this);
    
    						preListen.addActionListener (new ActionListener () {
    
    							@Override
    
    							public void actionPerformed(ActionEvent e) {
    
    								// TODO Auto-generated method stub
    
    								System.out.println("Encore un essai de clic ?");
    
    								
    
    							}
    
    							
    
    						});
    
    						String relativePath = fileToScan.getAbsolutePath().substring(pathLength+1);
    
    						
    
    						Object[] tagLine = {selected, relativePath, artist, title, trackLengthString, preListen, modified, fileToScan.getAbsolutePath()
    
    						};
    
    						
    
    						tagsList.add(tagLine);
    
    						
    
    						if (audioFileInDirectory == false) {
    
    							audioFileInDirectory = true;
    
    						}
    
    						
    
    					} catch (CannotReadException e) {
    
    						// TODO Auto-generated catch block
    
    						System.out.println("CannotReadException");
    
    						e.printStackTrace();
    
    					} catch (IOException e) {
    
    						// TODO Auto-generated catch block
    
    						System.out.println("IOException");
    
    						e.printStackTrace();
    
    					} catch (TagException e) {
    
    						// TODO Auto-generated catch block
    
    						System.out.println("TagException");
    
    						e.printStackTrace();
    
    					} catch (ReadOnlyFileException e) {
    
    						// TODO Auto-generated catch block
    
    						System.out.println("ReadOnlyFileException");
    
    						e.printStackTrace();
    
    					} catch (InvalidAudioFrameException e) {
    
    						// TODO Auto-generated catch block
    
    						System.out.println("InvalidAudioFrameException");
    
    						e.printStackTrace();
    
    					}
    
    				}
    
    
    
    			}
    
    
    
    		}
    
    		else {
    
    			System.out.println("Erreur de lecture");
    
    		}
    
    			
    
    	}
    
    	
    
    	/**
    
    	 * Renseigne les indice de chaque colonne en fonction de leur intitulé
    
    	 */
    
    	private void indexDefinition() {
    
    		
    
    		for (int i = 0 ; i < headerMetadataTable.length ; i+=1) {
    
    			if (headerMetadataTable[i] == "Selection") {
    
    				indexSelection = i ;
    
    			} else if (headerMetadataTable[i]=="Fichier") {
    
    				indexFile = i;
    
    			} else if (headerMetadataTable[i]=="Artiste") {
    
    				indexArtist = i;
    
    			} else if (headerMetadataTable[i]=="Titre"){
    
    				indexTitle = i;
    
    			} else if ( headerMetadataTable[i] == "Durée") {
    
    				indexLength = i;
    
    			} else if (headerMetadataTable[i] == "Aperçu") {
    
    				indexPreListen = i;
    
    			} else if (headerMetadataTable[i] == "Modified") {
    
    				indexModified = i;
    
    			} else if (headerMetadataTable[i] == "AbsolutePath") {
    
    				indexAbsolutePath = i;
    
    			}
    
    		}
    
    	}
    
    	
    
    	public void actionPerformed (ActionEvent arg0) {
    
    		if (arg0.getSource() == preListen) {
    
    			System.out.println("Vous avez cliqué sur Play");
    
    		} else {
    
    			System.out.println("Vous avez sans doute cliqué ailleurs");
    
    		}
    
    		
    
    	}
    
    	
    
    	/**
    
    	 * Retourne le JTable du constructeur
    
    	 * @return le JTable issu du constructeur
    
    	 */
    
    	public JTable getJTable() {
    
    		return metadataJTable;
    
    	}
    
    	
    
    	/**
    
    	 * Retourne le fait qu'il y ait ou non des fichiers audio dans le répertoire scanné
    
    	 * @return le fait qu'il y ait ou non des fichiers audio dans le répertoire scanné
    
    	 */
    
    	public boolean getAudioFileInDirectory() {
    
    		return audioFileInDirectory;
    
    	}
    
    	
    
    	/**
    
    	 * Retourne un tableau avec les en-têtes des colonnes du JTable
    
    	 * @return un tableau avec les en-têtes des colonnes du JTable
    
    	 */
    
    	public String[] getHeaderMetaData() {
    
    		return headerMetadataTable;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne "Sélection"
    
         * @return l'indice de la colonne "Sélection"
    
         */
    
    	public int getIndexSelection() {
    
    		return indexSelection;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne du nom du fichier (avec éventuellement le sous répertoire)
    
         * @return l'indice de la colonne du nom du fichier (avec éventuellement le sous répertoire)
    
         */
    
    	public int getIndexFile() {
    
    		return indexFile;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne avec le nom de l'artiste
    
         * @return l'indice de la colonne avec le nom de l'artiste
    
         */
    
    	public int getIndexArtist() {
    
    		return indexArtist;
    
    	}
    
    
    
        /**
    
         * Retourne le numéro de colonne du champ "Titre"
    
         * @return le numéro de colonne du champ "Titre"
    
         */
    
    	public int getIndexTitle() {
    
    		return indexTitle;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne de la durée du titre
    
         * @return l'indice de la colonne de la durée du titre
    
         */
    
    	public int getIndexLength() {
    
    		return indexLength;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne avec le bouton permettant la pré-écoute
    
         * @return l'indice de la colonne avec le bouton permettant la pré-écoute
    
         */
    
    	public int getIndexPreListen() {
    
    		return indexPreListen;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne "Modified"
    
         * @return l'indice de la colonne "Modified"
    
         */
    
    	public int getIndexModified() {
    
    		return indexModified;
    
    	}
    
    
    
        /**
    
         * Retourne l'indice de la colonne du "Absolute Path"
    
         * @return l'indice de la colonne du "Absolute Path"
    
         */
    
    	public int getIndexAbsolutePath() {
    
    		return indexAbsolutePath;
    
    	}
    
    
    
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Dr_Click
      21 septembre 2011 à 8:43:45

      Bonjour,
      Je trouve que c'est plutôt bien commenté. Par contre pour la présentation, supprime les espaces inutiles.

      Concernant ton problème. C'est tout a fait normal qu'il ne se passe rien lorsque tu cliques sur le bouton de ta JTable
      Tu est obligé de créer une classe héritant de DefaultCellEditor
      Comme pour le renderer.
      Renderer= vue uniquement.

      Tu peux regarder comment fonctionne cette classe:
      http://www.siteduzero.com/tutoriel-3-7 [...] tml#ss_part_4

      Le code est représentatif d'une action par un JButton.
      ^^
      • Partager sur Facebook
      • Partager sur Twitter

      Des boutons dans un JTable

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown