Les JTable avec des JButton (Swing)
Résolu
mikis69
Messages postés
168
Date d'inscription
Statut
Membre
Dernière intervention
-
mikis69 Messages postés 168 Date d'inscription Statut Membre Dernière intervention -
mikis69 Messages postés 168 Date d'inscription Statut Membre Dernière intervention -
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.
Si quelqu'un a également des conseils pour rendre la JTable plus belle esthétiquement parlant, je suis preneur ^^
Merci pour votre aide,
Mikis
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
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
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 !
"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..
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.
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é.
