8
votes

JTable avec fond rayé

Utiliser une couleur d'arrière-plan différente pour des lignes impairs et pair est un truc couramment utilisé pour améliorer la lisibilité des grandes tables.

Je veux utiliser cet effet dans JTABLE de Swing. J'ai commencé en créant un rendu de table personnalisé, mais cela ne peut être utilisé que pour peindre des cellules réelles, et je souhaite également ajouter des rayures à la partie "blanche" de la table dans laquelle il pourrait y avoir de cellules. Je peux sous-classe JTable et remplacer la peinture de PaintComponent (), mais je préférerais une option où je peux simplement changer le rendu de la table.

Y a-t-il une meilleure façon de le faire?

EDIT: Selon les réponses jusqu'à présent, cela semble impossible sans extension de Jtalie. Cependant, lorsque je remplace JTable.Painchcomponent (), il aussi ne peint que la zone où il y a des rangées. Comment puis-je peindre le reste?


1 commentaires

Pourquoi? Si une table n'a que 5 lignes de données et que vous souhaitez peindre 100, ajoutez simplement 95 lignes de données vierges. Utilisez un pour boucle 95 fois sur modèle.Ajouter (nouvel objet [] {}); . La zone vide appartient au dessous de Jscrollpane, pas la table, car sans limite, nous ne savons pas où arrêter. La JTABLE arrête de rendu quand il n'y a pas de données. C'est logique.


5 Réponses :


2
votes

Le jxttable fourni par SwoMx vous permet d'implémenter un tel rendu Jetez un coup d'œil à http://swinglabs.org/docs/ Composants / jxttable / tutoriel.jsp? Étape = 3 # Rowhighlighting


2 commentaires

Désolé, mais je ne sais pas si vous pouviez la personnaliser pour "ajouter des rayures à la partie" blanche "de la table dans laquelle il pourrait y avoir de cellules".


Les surligneurs sont souvent limités aux cellules.



0
votes

Utilisez JXTABLABLE ou si vous êtes super-paresseux (ou super-short-short :-))) Vous pouvez simplement utiliser «Nimbus».


3 commentaires

Nimbus ne change que le comportement des rendriers par défaut, de sorte qu'il ne s'étendra pas à l'extérieur des cellules, cependant.


Nope, j'ai dit son super paresseux ... mais tbh nimbus a la meilleure pour moi, alors je suis définitivement confortable avec par défaut


Dans le même genre de solution, vous pouvez également jeter un coup d'œil à la substance ( Substance.dev.java.net ) Laf, je l'ai utilisé dans le passé et je pouvais facilement le configurer avec un fond décapé.



1
votes

Vous pouvez également utiliser une personnalisation Tableau qui choisira la couleur pour vous, avec une partie du code comme celui-ci à l'intérieur:

if (isSelected) //color remains the same while selected
{
    lFgColor = table.getSelectionForeground();
    lBgColor = table.getSelectionBackground();
}
else
{
    lFgColor = table.getForeground();
    if (row%2 != 0) //once out of two rows, change color
        lBgColor = table.getBackground();
    else
    {
        //New look and feels like nimbus declare this property, try to use it
        lBgColor = UIManager.getColor("Table.alternateRowColor"); 
        if (lBgColor == null) //If not, choose your own color
            lBgColor = UIManager.getColor("Table.light");
        }
    }
}


2 commentaires

Le problème avec cette approche est qu'il n'ajoute pas un fond rayé pour la partie de la table où il n'y a pas de cellules.


@kees - vrai. J'ai généralement des tables plus larges que la Jscrollpane, j'ai donc oublié ce détail. J'ai remarqué que maintenant votre exigence dans la question, désolé. Notez que le surligneur de jxttable ne fonctionne que sur les cellules également, car il est également utilisé dans le contexte "Renderer". Si vous avez absolument besoin de l'étendre, cependant, vous devrez le faire vous-même, car la manière dont les tables sont rendues ne se concentrent que sur la zone «cellules».



1
votes

Utilisez Rendu de la rangée de table concepts qui est plus facile que de traiter avec des rendriers individuels.

Cette approche ne fonctionne que pour les cellules rendantes. Si vous souhaitez peindre à l'extérieur des limites de la table, vous devrez alors remplacer la méthode de la peinture () pour ajouter de la peinture personnalisée.


0 commentaires

4
votes

Utiliser getcellrect (getrowcount (grewowcount () - 1, 0, true) .y Pour obtenir la meilleure coordonnée Y de l'espace vide, puis peindre des rectangles et des lignes (grille) avec < Code> PaintComponent (graphiques g) .

jtalle avec grille d'espace vide

Pour vous rendre beaucoup plus facile pour vous, voici une longue solution (mais complète); -) xxx

Cet exemple pourrait être étendu à:

  • Fixez le pseudogrid peint pour des rangées variables (j'utilise la hauteur la plus basse utilisée dans n'importe quelle ligne)
  • Expliquez à l'utilisateur pourquoi rien ne se passe s'il clique dans l'espace vide pour éditer les cellules (via ToolTip)
  • Ajoutez une ligne supplémentaire au modèle de table si l'utilisateur clique dans l'espace vide (NOOO! Non Excel s'il vous plaît!)
  • Utilisez l'espace vide pour dessiner le reflet de la table (y compris toutes les données rendues (quoi pour? ;-))

2 commentaires

SETILLERSVIEWPORTHEIGNÉE (VRAI) Est-ce que j'ai raté. Merci!


Je voulais juste dire merci pour cette réponse, j'ai eu une modification de quelques choses (deux rangées de la même couleur au sommet lorsque la table est vide), mais de loin, c'est la meilleure solution au problème sans aller à une source de 3ème partie. . Merci beaucoup.