JTable Rendu De Cellule
Que je suis un peu de code que j'ai trouvé, (Oui, je comprends comment ça fonctionne)
C'est à partir d'ici :Code Lien
Ce que je suis en train de faire est de mettre en cellules d'une couleur de premier plan, si les cellules valeur est "jaune"
Voici mon Code:
public class Board extends JPanel{
private static final long serialVersionUID = 1L;
int boardHeight = 20;
int boardWidth = 10;
JTable table;
public Board() {
table = new JTable(this.boardHeight, this.boardWidth);
table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
table.setFocusable(false);
table.setShowGrid(false);
table.setRowMargin(0);
table.setIntercellSpacing(new Dimension(0,0));
table.setRowSelectionAllowed(false);
table.setVisible(true);
this.add(table);
this.setPreferredSize(new Dimension(table.getPreferredSize().width, (table.getPreferredSize().height + 85)));
}
public void paint(Graphics g) {
table.setRowHeight(20);
for (int x = 0; x < this.table.getColumnCount(); ++x) {
TableColumn col = this.table.getColumnModel().getColumn(x);
col.setPreferredWidth(20);
}
}
}
Et le Rendu de Cellule
public class BoardTableCellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int col) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
String s = table.getModel().getValueAt(row, col).toString();
if (s.equalsIgnoreCase("yellow")) {
c.setForeground(Color.YELLOW);
}
else {
c.setForeground(Color.WHITE);
}
return c;
}
}
Le problème est qu'il ne change pas, si j'ai mis toutes les cellules de la valeur à "jaune"
Merci d'avance!
Vous ne devriez pas être majeur Composite de la méthode de peinture, mais plutôt sa méthode paintComponent, et, indépendamment de cela, vous ne devriez jamais avoir une logique de programme étant appelé à partir de l'intérieur de la peinture ou de paintComponent. Ceci suggère que votre code doit être plus serré.
C'est là parce que finalement, je vais le faire stretch à la taille de la fenêtre, j'ai donc besoin de mettre à jour.
ce n'est pas comment vous faites, il est extensible. Encore une fois, ne mettez jamais la logique de code de ces méthodes. Vous de ne jamais avoir le plein contrôle sur quand ou même si cette méthode est appelée. Si vous devez absolument écouter un événement resize (et ne sont pas en utilisant le layout manager), vous devez ajouter un ComponentListener pour le Composite.
Ok, mauvais souvenir de recoder que plus tard. Merci!
Veuillez voir les éditions 1 et 2 dans ma réponse.
C'est là parce que finalement, je vais le faire stretch à la taille de la fenêtre, j'ai donc besoin de mettre à jour.
ce n'est pas comment vous faites, il est extensible. Encore une fois, ne mettez jamais la logique de code de ces méthodes. Vous de ne jamais avoir le plein contrôle sur quand ou même si cette méthode est appelée. Si vous devez absolument écouter un événement resize (et ne sont pas en utilisant le layout manager), vous devez ajouter un ComponentListener pour le Composite.
Ok, mauvais souvenir de recoder que plus tard. Merci!
Veuillez voir les éditions 1 et 2 dans ma réponse.
OriginalL'auteur Diesal11 | 2011-07-11
Vous devez vous connecter pour publier un commentaire.
Est votre convertisseur de même jamais utilisé? Vous en faire le moteur de rendu par défaut pour les cellules contenant la Chaîne, mais avez-vous surchargé de votre modèle
getColumnClass
méthode afin qu'elle sait que certaines des cellules sont des Chaînes?Alors d'abord, j'aimerais utiliser les rapports de println pour voir si le rendu est même d'être appelés, et si non, j'aimerais remplacer mon modèle de la méthode comme indiqué ci-dessus.
Edit 1
Aussi votre si les résultats sont liés à l'aspect étrange. Dans la partie si vous modifiez la présente et dans l'autre vous modifier l'arrière-plan -- n'a pas de sens. Vous devriez probablement faire de modifications complémentaires de l'état dans le si vs le reste des blocs, non orthogonale changements.
Edit 2
Par exemple:
table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
non, pas du tout. il définit uniquement le moteur de rendu pour les objets String, mais le modèle n'a aucun moyen de savoir ce qu'est une Chaîne de cellule, à moins que vous spécifiquement le dire, qui est pourquoi vous avez besoin d'étendre le modèle, généralement un DefaultTableModel.
voir les modifications, et s'il vous plaît lire le tutoriel comme la plupart de ce qui est là.
Je soupçonne l'invisible
TableModel
n'est pas de retourString.class
pour la colonne correspondante.Je suis d'accord. Je soupçonne que l'invisible
TableModel
reste invisible à l'OP aussi bien et n'a jamais été remplacé.OriginalL'auteur Hovercraft Full Of Eels
Ajouter cette ligne:
La pièce retournée par getTableCellRendererComponent doit être opaque pour voir les changements sur le fond et la couleur de premier plan.
Ici, le problème est autre: vous êtes l'extension de DefaultTableCellRenderer (qui est un JComponent), mais vous êtes de retour d'un Composant qui n'a pas setOpaque méthode. Je restructurer le code comme ceci:
Eclipse me dit qu'il n'a pas un SetOpaque méthode. et ça ne fonctionne pas également.
oui..vous avez raison. Je vais corriger la réponse.
Désolé d'être ennuyeux, mais ça ne marche toujours pas :/ Votre code a été accepté, mais la couleur n'est pas modifiée lorsque je change la valeur de la cellule.
DefaultTableCellRenderer
est opaque par défaut.OriginalL'auteur Heisenbug
Voici une solution simple, à l'utilisation TabaleCellRendere comme l'intérieur de la classe.
OriginalL'auteur Syed Maruf