Je voudrais faire une table modifiable, puis vérifier les données pour vous assurer que sa valide. Je ne sais pas comment changer la couleur d'une seule cellule. Je voudrais obtenir une cellule, par exemple (0,0) et colorer le premier plan au rouge. J'ai lu les autres messages sur ainsi que Oracle sur le Colorrenderer personnalisé, mais je ne comprends tout simplement pas comment j'utiliserais cela. P>
merci. p>
7 Réponses :
Dites que la cellule que vous voudriez rendre avec une couleur différente représente un statut (je vais prendre rejeté et approuvé comme des exemples). J'étais ensuite implémenter une méthode dans mon modèle de table appelé getStatus (intil ligne) qui renvoie le statut de n'importe quelle ligne donnée.
Puis, quand c'est en place, je voudrais créer un rendu cellulaire responsable de la rendu colonne que la cellule appartient. Le rendu de la cellule serait quelque chose dans les lignes du code ci-dessous. P> puis, lorsque le rendu est en place, "appliquer" le rendu à la table avec le tableau suivant Pièce de code: p> Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());
Sinon: Vous pouvez également éviter la mise en oeuvre de la méthode GetStatus () dans votre modèle de table si vous préférez cela. Dis, si votre modèle de modèle GetValueat (int Rowindex, int ColonIndex) renvoie les statuts en tant que chaînes ("approuvées", "rejetées"), vous pourriez simplement avoir le rendu pour vérifier la valeur fournie [...] Renderercomponent (table, valeur , Boolean [...]) et modifier la couleur de la cellule en fonction de cela. Ensuite, vous n'avez pas besoin de prendre le "détour" au modèle de table pour obtenir le statut de la ligne / colonne en cours. Cela pourrait en fait être le moyen le plus simple de le faire ...
Une dernière petite note: si vous alliez pour la solution dans laquelle vous implémentez GetStatus (INT RILL), assurez-vous de convertir l'index de la ligne à l'aide de la table.Convertrowindextomodel (Int ligne). La ligne fournie à GettablecellRendererComponent () est l'index de vue, qui peut être différente de l'index du modèle si la commande de lignes est modifiée en raison du tri.
La manière la plus simple consiste à écrire un simple nappellrenderer code> en étendant le
defaulttablecellrenderer code>
et écrasement le gettablecellrenderercomponent code> méthode sur
setbackground (couleur.red) code>. Par exemple:
non - c'est incomplet: DefaultTableCelleditor est une implémentation cassée qui présente la «mémoire de couleur» infâme - lorsque vous touchez des couleurs une fois, vous devrez le faire toujours, c'est-à-dire ajouter une branche d'autre si
@ Kleopatra Vous avez raison, il devrait y avoir un sinon code> qui réinitialise la couleur au noir. De plus, il n'y a pas de
SetCellRenderer code> sur
JTABLE code> de sorte qu'il s'agit d'un exemple incomplet. Mes intentions étaient que cela montrerait la puissance suffisante pour commencer le bon chemin et ils pourraient apprendre les petits détails eux-mêmes.
Je voudrais faire une table modifiable, puis vérifier les données pour vous assurer que sa valide. P>
Une autre approche serait de modifier les données avant qu'il ne soit enregistré sur le modèle de table pour empêcher les données non valides d'être entrées. P>
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.table.*; public class TableEdit extends JFrame { TableEdit() { JTable table = new JTable(5,5); table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollpane = new JScrollPane(table); getContentPane().add(scrollpane); // Use a custom editor TableCellEditor fce = new FiveCharacterEditor(); table.setDefaultEditor(Object.class, fce); } class FiveCharacterEditor extends DefaultCellEditor { FiveCharacterEditor() { super( new JTextField() ); } public boolean stopCellEditing() { try { String editingValue = (String)getCellEditorValue(); if(editingValue.length() != 5) { JTextField textField = (JTextField)getComponent(); textField.setBorder(new LineBorder(Color.red)); textField.selectAll(); textField.requestFocusInWindow(); JOptionPane.showMessageDialog( null, "Please enter string with 5 letters.", "Alert!",JOptionPane.ERROR_MESSAGE); return false; } } catch(ClassCastException exception) { return false; } return super.stopCellEditing(); } public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { Component c = super.getTableCellEditorComponent( table, value, isSelected, row, column); ((JComponent)c).setBorder(new LineBorder(Color.black)); return c; } } public static void main(String [] args) { JFrame frame = new TableEdit(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } }
C'est probablement ce que je cherche, je vais donner un coup et vous le faire savoir. J'ai un bouton Enregistrer pour vérifier que toutes les données sont valides avant d'économiser. Je veux pouvoir enregistrer les données valides et saupoudrez les données qui ne sont pas. Merci!
C'est le moyen le plus simple de colorer une colonne ou une cellule particulière dans une jtalie.
Créez d'abord une classe simple de CustomRenderer CODE> P>
model3.getDataVector().removeAllElements();
model3.fireTableDataChanged();
-1 pour FIREXX de l'extérieur (se demandant si c'était vous qui avec l'exact Même réponse incorrecte - même nom, nouveau compte ?)
Je crois que la bonne façon de faire de la coloration dans une table est via un Voici un exemple de comment utiliser des surligneurs. Dans ce cas, il est de mettre en évidence une cellule qui n'est pas éditable. P> puis dans votre code pour la configuration du tableau, vous ajoutez le surligneur et ses paramètres de couleur: P > ColorHighLighter code>. Les rendriers de la table ont des problèmes pour rendre différentes couleurs dans la même colonne. strong>
ColorHighlighter grayHighlighter = new ColorHighlighter(new IsCellEditablePredicate(table));
grayHighlighter.setBackground(Color.LIGHT_GRAY);
grayHighlighter.setForeground(table.getForeground());
grayHighlighter.setSelectedBackground(table.getSelectionBackground().darker());
grayHighlighter.setSelectedForeground(table.getSelectionForeground().darker());
table.setHighlighters(grayHighlighter);
Que voulez-vous dire exactement avec votre phrase en gras? Pourriez-vous donner un exemple s'il vous plaît?
@Override 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); int control = row; control = control % 2; control = (control == 0) ? 1 : 0; if (control == 1) { c.setBackground(Color.green); } else { c.setBackground(Color.cyan); } return c; }
Bienvenue dans le débordement de la pile! S'il vous plaît, ne jetez pas simplement votre code source ici. Soyez gentil et essayez de donner une belle description à votre réponse, de sorte que d'autres l'apprécieront et l'avoivent. Voir: Comment puis-je écrire une bonne réponse?
Vous pouvez étendre defaultTableCellrenderer, remplacer GetTablecellRendererComponent et appelez quelque chose comme avant de renvoyer "ceci" lorsque les conditions s'appliquent, mais il a un effet secondaire très gênant de modifier la couleur arrière par défaut due à la manière dont refletTableCellrenderer.setbackground est codé. P> Le truc que j'ai trouvé était de dupliquer entièrement le code de défaillanceTableCellrenderer dans une classe nommée Hackeddefaulttablecellrenderer, ajoutez une méthode qui appelle directement la mise en oeuvre du concepteur du composant: P> < PRE> XXX PRE> Dérivez ensuite mon personnalisé rendu de cette classe piraté au lieu de DefaultTablecellRenderer, puis appelle enfin SetComponEnterbackground au lieu de se mettre au dos dans My Personnalisé GettablecellrendererComponent. P> L'inconvénient est que ce packeddefaulttablecellrender s'appuie. sur un instantané de défautTableCellrenderer. p> p>