2017-06-23 2 views
0

J'utilise un JTable pour afficher des données multi-lignes. Mes données sont formatées en HTML et impliquent plusieurs lignes pour chaque cellule. Je veux que chaque fois que la table est redimensionnée, la ligne JTable augmente de façon dynamique pour pouvoir afficher tout le contenu. Jusqu'à présent, je l'ai utilisé cela pour redimensionner dynamiquement les hauteurs de ligne dans ma classe renderer personnalisée:Définir dynamiquement JTable Row Height

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
       int row, int column) { 
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight()); 
      int height = getHeight(); 
      if (table.getRowHeight(row) != height){ 
       table.setRowHeight(row, height); 
       table.repaint(); 
      } 
      return c; 
     } 

Le problème est que la hauteur des lignes est déterminée par le nombre de sauts de ligne (<br />) dans la contenu cellulaire; Par exemple, si la ligne comporte deux lignes <br />, la hauteur de ligne s'ajuste uniquement à l'équivalent de deux hauteurs de ligne. Cela ignore les situations où certaines lignes sont longues et enveloppantes, ce qui signifie que le contenu de la cellule sera plus de deux lignes. C'est ce que je veux dire. Ma valeur de la cellule ressemble à quelque chose comme:

String str = "<html> " 
+ "<p style = \"font-family: 'Euphemia'; font-size: 1.1em;\"> " 
+ "This is a line <br /> " 
+ "This is a second line which will be very long causing it to automatically wrap to a new line <br /> " 
+ "This is the third line. " 
+ "</p> " 
+ "</html> "; 

Dans ce cas, car il y a trois balises <br /> la ligne sera redimensionnée à un seul spectacle trois lignes se cachant donc la dernière ligne. Je préfère utiliser html car il me donne la variété de formatage que je veux afficher le contenu. Comment puis-je contourner cela?

Répondre

0

Essayez quelque chose comme ceci pour calculer la taille:

public Dimension calcSize(final String text) 
{ 
    final JLabel l = new JLabel(text); 
    return l.getPreferredSize(); 
} 

Vous pouvez déplacer le JLabel vers un champ statique pour l'optimisation de la vitesse ...