Les JTable avec des JButton (Swing) [Résolu/Fermé]

Signaler
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
-
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
-
Bonjour tout le monde,

Dans le cadre d'un projet personnel, j'utilise des JTable mais j'ai un problème majeur au niveau de la séléction d'une ligne.

Une image est mieux qu'un long discours donc voici l'image de ma JTable.



Comme vous pouvez le voir sur l'image, lorsqu'une ligne est séléctionnée, seuls les colonnes "String" ont le fond bleu/gris et les colonnes "JButton", ne l'ont pas.. Or j'aimerai vraiment que toutes les colonnes aient le fond bleu/gris lorsqu'une ligne est séléctionnée.

J'ai essayé de multiple chose mais rien de ce que j'ai fait à présent n'a résolu le problème.

addMouseListener(new TableMouseListener(this));
        setDefaultRenderer(Object.class, new TableCellRenderer());
		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		setRowHeight(25);


public class TableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    	super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        setBorder(BorderFactory.createEmptyBorder(0, 3, 2, 0));
	    setFont(getFont().deriveFont(14f));
	    
        if(value instanceof Button) {
        	return (Button) value;
        }
        
        return this;
    }
}



Si quelqu'un a également des conseils pour rendre la JTable plus belle esthétiquement parlant, je suis preneur ^^

Merci pour votre aide,

Mikis

3 réponses

Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Bonjour,

Le problème c'est que ton bouton prends toute la taille de la case donc il ne laisse plus transparaître le fond de la ligne qui change de couleur.

Tu pourrais utiliser le paramètre isSelected pour identifier quand la ligne est sélectionnée et changer la couleur de fond du bouton en conséquence.

Exemple :

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

public class Test {

    public static void main(String[] args) {
        Object[][] rowData = { { "a1", "b1", new JButton("c1") }, { "a2", "b2", new JButton("c2") } };
        String[] numColumns = { "a", "b", "c" };
        JTable table = new JTable(rowData, numColumns);
        table.setSelectionBackground(Color.YELLOW);
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                if (value instanceof JButton) {
                    JButton button = (JButton) value;
                    button.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
                    return button;
                } else {
                    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                }
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(table);
        frame.pack();
        frame.setVisible(true);
    }
}
La confiance n'exclut pas le contrôle
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
Bon ben après ce que vous m'avez dit :

"Du coup le problème peut venir de la manière dont tu as codé cette classe"

J'ai été voir la classe en question et voilà le code qu'il y avait :

public Button(String icon, ActionListener action) {
		super(new ImageIcon("icons" + File.separator + icon));
		addActionListener(action);
        setBorderPainted(false);
		setBorder(null);
		setBackground(null);
        setMargin(new Insets(0, 0, 0, 0));
        setContentAreaFilled(false);
	}


Le soucis était donc le setContentAreaFilled(false) que j'avais mis pour justement ne pas avoir de changement de couleur lorsque je clique sur un bouton. Malheureusement, le rendu sur les JTable n'était pas terrible puisque les boutons n'avaient pas de fond.

J'ai donc remplacé le code ci-dessus par celui ci

public Button(String icon, ActionListener action) {
		super(new ImageIcon("icons" + File.separator + icon));
		addActionListener(action);
        setBorderPainted(false);
		setBorder(null);
		setBackground(null);
        setMargin(new Insets(0, 0, 0, 0));
        
        addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				((JButton) e.getSource()).setContentAreaFilled(false);	
			}
        	
        });
	}


Et sans que je sache pourquoi, cela fonctionne très bien maintenant.
Dans les tables le résultat est super et lorsque je clique sur un bouton, il n'y a pas de changement de couleur.



Merci en tout cas !
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
"Le problème c'est que ton bouton prends toute la taille de la case donc il ne laisse plus transparaître le fond de la ligne qui change de couleur."

Pourtant lorsque je fais un

table.setBackground(Color.ORANGE);


J'obtiens ceci



Et j'ai même essayé un truc pour rendre plus joli. Alterner la couleur une ligne sur deux mais le rendu sur les boutons sont toujours "sans couleur" (la couleur par defaut de la JTable)



Je crois qu'il y a un truc que j'ai pas compris dans les Renderer ou les Editor qui permettrait de faire apparaitre mon boutton et le fond de la cellule..
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1 >
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021

Rien ne se passe lorsque j'écris votre code..

Si vous reprenez la troisième image, d'où pensez-vous que le problème vienne ? car les boutons ne sont pas "colorier" une ligne sur deux..
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843 >
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019

Si tu as mis mon code tel quel, c'est normal que rien ne se passe, car dans mon exemple j'ai pris des JButton (Swing), alors que toi tu as mis des Button (AWT), donc le instanceof ne peut pas fonctionner si on ne parle pas de la même classe.

Dans la mesure où tu fais du Swing tu devrais remplacer tes Button par des JButton.
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
En fait la classe Button que j'ai mis hérite de JButton ..
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843 >
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019

Ah... ce n'est pas la classe Button de java.awt ?
C'est une mauvaise idée de l'avoir nommée comme une classe standard Java.

Du coup le problème peut venir de la manière dont tu as codé cette classe... sauf que ça ne fait pas parti des morceaux de code que tu nous as donné.

Remarque : tu peux tester le code que j'ai mis tout à l'heure (c'est un main à lancer) tu verras qu'il fonctionne très bien et que le bouton y est bien surligné.
 
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1 >
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021

D'accord, je regarde cela ce soir et je vous donne un retour très rapidement avec des infos complémentaires sur ma classe Button.

Merci pour votre aide et à demain :)