Comment le retour à la ligne dans une jtable cellule?
Je suis en train de mettre en œuvre une coutume TableRenderer comme décrit dans ce tutoriel.
J'aimerais avoir le rendu de la ligne de chaque texte, c'est long pour une cellule donnée.
L'idée est d'utiliser un TextArea comme moteur de rendu, comme il prend en charge la ligne d'emballage. Toutefois, le code suivant ne se comportent pas comme prévu:
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
this.setText((String)value);
this.setWrapStyleWord(true);
this.setLineWrap(true);
return this;
}
}
Que j'ai mis ce moteur de rendu avec
table.setDefaultRenderer(String.class, new LineWrapCellRenderer());
Mais la cellule entrées de séjour déballé.
Si j'ajoute this.setBackground(Color.YELLOW)
à la getTableCellRendererComponent()
méthode,
toutes les cellules sont jaunes comme prévu, mais pas emballé.
Des idées?
Mise à JOUR: Que Michael Borgwardt indiqué dans les commentaires, le problème n'est pas le wrap ligne, mais la hauteur de ligne: JTables lignes sont de taille fixe, de sorte que si une cellule est en train de monter (car le texte est maintenant multi-alignés), nous devons augmenter la hauteur de ligne.
Mais de combien? Je vais vérifier si cela vaut la peine de l'autre, de SORTE question. Si non, je vais ajouter cette solution ici.
Update2: Le code suivant va déterminer la hauteur de ligne (si elle est placée dans getTableCellRendererComponent()
):
int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
int textLength = this.getText().length();
int lines = textLength / this.getColumns() +1;//+1, cause we need at least 1 row.
int height = fontHeight * lines;
table.setRowHeight(row, height);
- ne pas modifier le tableau de l'état dans le moteur de rendu - comme dans jamais
- Chers Cléopâtre!!! Merci de nous donner une solution de travail, au lieu de simplement dire que vous pouvez faire mieux.
- Veuillez vérifier cette stackoverflow.com/questions/33937074/jtable-cell-wrapping/...
Vous devez vous connecter pour publier un commentaire.
Le problème est que la hauteur des lignes dans JTable est fixe, il n'est donc pas juste une question d'avoir un moteur de rendu qui enveloppe; je ne sais pas pourquoi ça ne marche pas, mais si il l'a fait, le texte enveloppé pourrait être recadrée ou peut-être que c'est exactement ce que vous voyez. Pour ajuster la hauteur des lignes, vous devez définir individuellement.
Salut j'ai eu le même problème mais la solution que j'ai mis en œuvre est inspirée par l'exemple de la disposition de la Java Tutoriel pour dessiner le texte multiligne et dessine le texte sur la cellule à l'aide du texte de l'Api.
http://java.sun.com/docs/books/tutorial/2d/text/drawmulstring.html
Il redimensionne ligne en hauteur aussi, mais il le fait bien seulement quand ce convertisseur est utilisé pour une seule colonne.
Et ce est la façon dont j'ai utilisé de l'invoquer pour rendre ma table.
table.setRowHeight(rowIndex,(int) drawPosY);
pour final int hauteur = (int) drawPosY; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { tableau.setRowHeight(rowIndex, hauteur); } });`. Avec cela, vous résoudre le problème de l'appel à changer la disposition de l'INTERFACE utilisateur dans la méthode paint.En plus de cette question, je voudrais partager avec vous une solution pour multiligne cellule de l'éditeur. C'est un peu hacky (magasins de référence édité ligne), mais fait le travail.
Utilisé de la manière suivante:
Vous pouvez utiliser un JLabel comme un moteur de rendu et d'insérer le texte dans une balise HTML et juste ajouter
<br>
le cas échéantComment utiliser le HTML dans les Composants Swing
Je suis tombé dans ce même problème, et j'ai dû modifier un peu le code qu'il a été écrit ici, j'ai donc brancher mon propre version:
Écrire les en-têtes HTML. Voici un exemple de ce que j'ai. Le seul problème que je rencontre est que je vais avoir du mal à les avoir faites défiler jusqu'à la
JPanel
si je ajuster la hauteur des têtes.utilisation setBounds sur le moteur de rendu composant (voir ci-dessous)
Ci-dessus fonctionne très bien dans ce SSCCE... mais dans le monde réel, avec des polices plus complexes, plus de texte et les plus grandes tables vous commencez à rencontrer des problèmes. Je vous propose donc ci-dessous une nouvelle version de l'Auditeur classe avec une nouvelle version du moteur de rendu (juste pour introduire l'utilisation d'un complexe de police...). Remplacer dans le ci-dessus SSCCE si intéressé...
Comme noté au-dessus de la hauteur de ligne doit être calculée, mais la solution actuelle pourrait être améliorée. En fait, il ne fonctionnait pas pour moi.
jtxt.getColumns()
était de retour à zéro provoque une division par zéro. Voici un peu de code, je pense, est plus propre: