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

mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - 26 nov. 2017 à 15:02 - Dernière réponse : mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention
- 26 nov. 2017 à 21:43
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
Afficher la suite 
143Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention

9 réponses

Répondre au sujet
KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - Modifié par KX le 26/11/2017 à 18:04
+1
Utile
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
Commenter la réponse de KX
mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - Modifié par mikis69 le 26/11/2017 à 18:19
0
Utile
6
"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..
mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention > KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - 26 nov. 2017 à 18:31
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..
KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention > mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - 26 nov. 2017 à 18:36
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.
mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - 26 nov. 2017 à 18:44
En fait la classe Button que j'ai mis hérite de JButton ..
KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention > mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - 26 nov. 2017 à 18:49
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é.
 
mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention > KX 15074 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - 26 nov. 2017 à 18:50
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 :)
Commenter la réponse de mikis69
mikis69 143 Messages postés mardi 26 novembre 2013Date d'inscription 26 novembre 2017 Dernière intervention - 26 nov. 2017 à 21:43
0
Utile
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 !
Commenter la réponse de mikis69