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
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
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié le 26 nov. 2017 à 18:04
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 :
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
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
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 :
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
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 !
"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 !
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
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
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..
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..
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
26 nov. 2017 à 18:19
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; }
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
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
26 nov. 2017 à 18:31
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..
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
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
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
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.
Dans la mesure où tu fais du Swing tu devrais remplacer tes Button par des JButton.
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
26 nov. 2017 à 18:44
En fait la classe Button que j'ai mis hérite de JButton ..
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
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
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é.
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é.