Les JTable avec des JButton (Swing)

Résolu/Fermé
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 26 nov. 2017 à 15:02
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 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

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 26 nov. 2017 à 18:04
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
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
26 nov. 2017 à 21:43
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
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
Modifié le 26 nov. 2017 à 18:19
"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..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 nov. 2017 à 18:19
Là c'est la table que tu colories en orange, moi je parle de ne colorer que le bouton, comme dans mon exemple.

if (value instanceof JButton) {
    JButton button = (JButton) value;
    button.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
    return button;
}
0
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
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..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
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.
0
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
26 nov. 2017 à 18:44
En fait la classe Button que j'ai mis hérite de JButton ..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
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é.
 
0