Aller au contenu

[résolu] JSpinner et JCheckBox non-modifiable


windu.2b

Messages recommandés

Bonjour,

J'ai un problème avec un JTable que j'ai créé: j'ai dans une case de chaque ligne, un JSpinner pour pouvoir modifier la quantité d'un produit (à raison d'une ligne par produit dans mon JTable).

Le code est le suivant:

private TableCellRenderer getQuantiteRenderer()
{
	return new DefaultTableCellRenderer()
	{
		/**
		 * 
		 */
		private static final long	serialVersionUID	= 2082226634566564026L;




		@Override
		public Component getTableCellRendererComponent( JTable table,
				Object value, boolean isSelected, boolean hasFocus,
				int row, int column )
		{
			JSpinner spinner = new JSpinner(
					new SpinnerNumberModel( Integer
							.parseInt( value.toString() ),
							Integer.MIN_VALUE, Integer.MAX_VALUE, 1 ) );
			spinner.setEnabled( true );

			return spinner;
		}
	};
}

Cette méthode est bien appelée, et elle permet de définir comment mon élément doit être dessiné dans la case. L'élément est dessiné correctement, sauf qu'il n'est pas modifiable via les flèches 'haut' et 'bas' propres à tout JSpinner (elles sont grisées). Par contre, j'arrive à modifier la valeur en modifiant ce que la méthode reçoit en paramètre 'value' (par un appel de code Java, je peux donc modifier comme je veux cette valeur affichée, mais pas par un clic).

L'appel à cette méthode se fait depuis cette autre méthode (Il s'agit de la 2° ligne dans la méthode):

/**
 * Sets column renderers.
 */
private void setColumnRenderers( UserPreferences preferences )
{
	TableCellRenderer checkRenderer = getDefaultRenderer( Boolean.class );
	TableCellRenderer quantiteRenderer = getQuantiteRenderer();
	TableCellRenderer nameRenderer = getProductNameRenderer();
	TableCellRenderer priceRenderer = getPriceRenderer( preferences );
	TableCellRenderer priceTotalRenderer = getPriceRenderer( preferences );

	TableCellRenderer[] columnRenderers = { checkRenderer,
			quantiteRenderer, nameRenderer, priceRenderer,
			priceTotalRenderer };

	TableColumnModel columnModel = getColumnModel();
	for ( int i = 0, n = getColumnCount(); i < n; i++ )
	{
		columnModel.getColumn( i ).setCellRenderer( columnRenderers[i] );
	}
}

J'ai d'ailleurs le même problème avec un JCheckBox, qui est appelée par la 1° ligne de la méthode ci-dessus (dans ce cas, je fais appel à la méthode par défaut déjà incluse dans Java, je ne l'ai donc pas codée moi-même).

Lien vers le commentaire
Partager sur d’autres sites

Bon, ça marche pas encore comme il faut!

J'ai bien fait un override de la méthode isCellEditable (int rowIndex, int columnIndex ), tout se passe bien de ce coté, mais quand je clique, ça ne coche toujours pas!

Et pourtant, j'ai fait ceci:

private void addMouseListener( final ProductController controller )
{
	addMouseListener( new MouseAdapter()
	{
		@Override
		public void mouseClicked( MouseEvent ev )
		{
			if ( ev.getClickCount() == 1 )
			{
				int columnIndex, rowIndex;
				Point p = ev.getPoint ();
				columnIndex = columnAtPoint ( p );
				rowIndex = rowAtPoint ( p );
				System.out.println( getValueAt( rowIndex, columnIndex ) );
				if( getValueAt( rowIndex, columnIndex ) == Boolean.FALSE )
					setValueAt( Boolean.TRUE, rowIndex, columnIndex );
				else
					setValueAt( Boolean.FALSE, rowIndex, columnIndex );
				System.out.println( getValueAt( rowIndex, columnIndex ) );
			}
			else if ( ev.getClickCount() == 2 )
			{
				// TODO gérer l'ajout via un double-clic
				System.out
						.println( "Double-clic dans ProductTable.addMouseListener()" );
				controller.modifySelectedProduct();
			}
		}
	} );
}

Comme on le voit, lorsque je fais un simple-clic, ça doit récupérer la ligne et la colonne cliquée, et afficher son état avant et après modification. Sauf que setValue() ne semble pas changer la valeur! J'ai toujours 'false' qui s'affiche :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Ça y est j'ai réussi!!! :transpi:

bon, je vous mets le code de ma méthode, si cela peut en aider d'autres, servez-vous c'est là pour ça :transpi: :

private class BooleanCellEditor extends AbstractCellEditor implements
		TableCellEditor, TableCellRenderer, ItemListener
{
	/**
	 * 
	 */
	private static final long	serialVersionUID	= -1131836209327529209L;


	JCheckBox				  jCheckBox			 = new JCheckBox();


	int						  currentRow;


	int						  currentColumn;




	public Component getTableCellEditorComponent( JTable jTable,
			Object value, boolean isSelected, int rowIndex, int vColIndex )
	{
		currentRow = rowIndex;
		currentColumn = vColIndex;
		jCheckBox.setHorizontalAlignment( SwingConstants.CENTER );
		boolean bValue = ( ( Boolean ) value ).booleanValue();
		if ( bValue == false )
		{
			return null;
		}
		else
		{
			// Fixer l'état de départ
			jCheckBox.setSelected( bValue );
			jCheckBox.addItemListener( this );
			return jCheckBox;
		}
	}




	public Object getCellEditorValue()
	{
		return Boolean.valueOf( jCheckBox.isSelected() );
	}




	@Override
	public boolean isCellEditable( EventObject evt )
	{
		if ( evt instanceof MouseEvent )
		{
			// For single-click activation
			int clickCount = 1;
			return ( ( MouseEvent ) evt ).getClickCount() >= clickCount;
		}
		return true;
	}




	public Component getTableCellRendererComponent( JTable table,
			Object value, boolean isSelected, boolean hasFocus, int row,
			int column )
	{
		// Create a panel and add the check box to it.
		JCheckBox checkBox = new JCheckBox();
		checkBox.setHorizontalAlignment( JLabel.CENTER );
		checkBox.setSelected( ( ( Boolean ) value ).booleanValue() );

		return checkBox;
	}




	public void itemStateChanged( ItemEvent e )
	{
		if ( e.getSource() instanceof JCheckBox )
		{
			//TODO je sais pas encore quoi y mettre
		}
	}
}

Et merci encore, Sentinel 8)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...