Comment ajuster la JTable colonnes pour les adapter à la plus longue de contenu dans les cellules de colonne
Je suis en utilisant réponse https://stackoverflow.com/a/5820366 et http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/ et il fonctionne, mais souvent les colonnes de tailles sont trop large ou trop étroit.
Pas question de remplir ma table avec HTML ou texte.
En utilisant la norme TableModel
de la documentation d'oracle.
Le mode de redimensionnement = JTable.AUTO_RESIZE_OFF
Conteneur de ma table est jGoodies:
FormLayout currentEventLayout = new FormLayout(
"fill:p",
"pref, pref");
PanelBuilder currentEventBuilder = new PanelBuilder(currentEventLayout);
currentEventBuilder.add(mainQuotesTable.getTableHeader(), constraints.xy(1, 1));
currentEventBuilder.add(mainQuotesTable, constraints.xy(1, 2));
Exemple de code HTML:
"<html><pre><font size=+1 face='Arial'>" + firstValue + "\n" + secondValue + "</font></pre></html>"
ligne simple:
firstValue + " - " + secondValue
Voici l'exemple:
public class TableAdjustExample {
private static JTable mainTable;
private static Random random = new Random();
private static List<Data> data;
private static class Data {
String name;
String surname;
private Data(String name, String surname) {
this.name = name;
this.surname = surname;
}
}
public static void main(String[] args) {
data = stubProvider();
final JFrame frame = new JFrame("table adjust example");
frame.add(createUI());
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(350, 400);
frame.setVisible(true);
update();
java.util.Timer timer = new java.util.Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
update();
}
}, 3000, 3000);
}
private static JPanel createUI() {
JPanel jPanel = new JPanel();
mainTable = new JTable(2, 3);
mainTable.setModel(new AbstractTableModel() {
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Data dataItem = data.get(rowIndex);
if (columnIndex == 0) {
return dataItem.name;
}
if (columnIndex == 1) {
return dataItem.surname;
}
throw new IllegalStateException();
}
});
mainTable.setGridColor(Color.black);
mainTable.setShowHorizontalLines(false);
mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
final TableCellRenderer defaultRenderer = mainTable.getTableHeader().getDefaultRenderer();
mainTable.getTableHeader().setDefaultRenderer(new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable jTable, Object o, boolean b, boolean b1, int row, int column) {
JLabel parent = (JLabel) defaultRenderer.getTableCellRendererComponent(jTable, o, b, b1, row, column);
if (column == 0) {
parent.setText("name");
} else {
parent.setText("surname");
}
return parent;
}
});
jPanel.add(mainTable.getTableHeader());
jPanel.add(mainTable);
return jPanel;
}
private static void update() {
System.out.println("updating");
data = stubProvider();
adjustJTableRowSizes(mainTable);
for (int i = 0; i < mainTable.getColumnCount(); i++) {
adjustColumnSizes(mainTable, i, 2);
}
}
private static void adjustJTableRowSizes(JTable jTable) {
for (int row = 0; row < jTable.getRowCount(); row++) {
int maxHeight = 0;
for (int column = 0; column < jTable.getColumnCount(); column++) {
TableCellRenderer cellRenderer = jTable.getCellRenderer(row, column);
Object valueAt = jTable.getValueAt(row, column);
Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(jTable, valueAt, false, false, row, column);
int heightPreferable = tableCellRendererComponent.getPreferredSize().height;
maxHeight = Math.max(heightPreferable, maxHeight);
}
jTable.setRowHeight(row, maxHeight);
}
}
public static void adjustColumnSizes(JTable table, int column, int margin) {
DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel();
TableColumn col = colModel.getColumn(column);
int width;
TableCellRenderer renderer = col.getHeaderRenderer();
if (renderer == null) {
renderer = table.getTableHeader().getDefaultRenderer();
}
JLabel comp = (JLabel) renderer.getTableCellRendererComponent(
table, col.getHeaderValue(), false, false, 0, 0);
width = comp.getPreferredSize().width;
for (int r = 0; r < table.getRowCount(); r++) {
renderer = table.getCellRenderer(r, column);
comp = (JLabel) renderer.getTableCellRendererComponent(
table, table.getValueAt(r, column), false, false, r, column);
int currentWidth = comp.getPreferredSize().width;
width = Math.max(width, currentWidth);
}
width += 2 * margin;
col.setPreferredWidth(width);
}
private static List<Data> stubProvider() {
List<Data> data = new ArrayList<Data>();
for (int i = 0; i < 4; i++) {
data.add(new Data(
"<html>" +
"<div style='font-size: 15px'>Jason</div>" +
"<div style='font-size: 15px'>" + random.nextInt() + "</div>" +
"</html>",
"Statham " + random.nextInt()));
}
return data;
}
}
J'ai ce genre de problème avec la ligne de réglage de la hauteur. À l'aide de <pre>\n</pre>
au lieu de <br>
de ligne fixe de réglage.
J'ai aussi essayé d'utiliser packAll de jxtable mais il se comporte comme jtable - parfois de couper le texte et parfois laisse beaucoup de rembourrage
Vous devrez peut-être ajouter dans la colonne de la grille (pcc1 pixel supplémentaire) et/ou d'ajouter plus de rembourrage. Pour que cela fonctionne bien, assurez-vous que votre utilisation d'une police à largeur fixe.
que voulez-vous dire à largeur fixe de la police? Im remplissage de la table de façon dynamique et je ne connais pas la largeur du contenu suivant. Aussi, si j'utilise setRowHeight, mal largeur de colonne apparaît plus fréquemment et je ne peux pas comprendre comment ses.
Il existe deux types de
Essayé. Nan.. toujours pas de travail
Vous devrez peut-être ajouter dans la colonne de la grille (pcc1 pixel supplémentaire) et/ou d'ajouter plus de rembourrage. Pour que cela fonctionne bien, assurez-vous que votre utilisation d'une police à largeur fixe.
que voulez-vous dire à largeur fixe de la police? Im remplissage de la table de façon dynamique et je ne connais pas la largeur du contenu suivant. Aussi, si j'utilise setRowHeight, mal largeur de colonne apparaît plus fréquemment et je ne peux pas comprendre comment ses.
Il existe deux types de
Font
s que le système peut utiliser, généralement Swing utilisation d'une largeur fixe de la police, ce qui signifie que chaque caractère dans la police est la même largeur, mais vous pouvez également fournir une largeur variable de police, où chaque personnage est potentiellement une largeur différente, ce qui va la faire à côté de, près de impossible de calculer une moyenne raisonnable de la largeur de colonne - Arial
est une police à largeur variableEssayé. Nan.. toujours pas de travail
OriginalL'auteur trickster77777 | 2012-10-22
Vous devez vous connecter pour publier un commentaire.
Semble être ok pour moi...
Mis à JOUR
Il y a un certain nombre de problèmes avec votre exemple.
JScrollPane
, ce sera prendre soin de l'ajout de l'en-tête...JPanel
estFlowLayout
, dans ce cas, il n'est probablement pas ce que vous voulez, vous voudrez probablement utiliser uneBorderLayout
java.util.Timer
contrevient à la présente politique, ce qui pourrait causer le modèle et la vue de la chute de la synchronisation. Utiliser unjavax.swing.Timer
à la place.<div>
à côté de chacun sera la cause de la mise en page html moteur de placer une faiblesse de la rupture entre les éléments. C'est, si le moteur décide il n'y a pas assez d'espace disponible pour rendre les deux éléments ensemble, on va les diviser. Mieux vaut utiliser un seul<div>
avec deux<span>
tags lieu...Je voudrais avoir une lecture de
? Ce type de minuteur ? Avez-vous un exemple de code que je peux jouer avec ?
le même que j'ai utilisé dans mon exemple
lors de la table de remplissage par l'habitude de la chaîne, ce bug apparaît très rarement
Grand Bro yar +1 pour la droite ans. 🙂
OriginalL'auteur MadProgrammer
De fixer des MinimumWidth pour les colonnes qui sont trop étroites. Puis calculer la largeur en fonction du contenu des colonnes et à les définir.
Component
(contenu de la cellule) renvoie faux PreferredSize dans certaines conditions. C'est pourquoi n'importe définir MinSize ou PrefSize. J'ai besoin d'ajuster les colonnes après chaque mise à jour de table.1) il n'y a pas de problème pour obtenir maxSize de la Chaîne de valeur et à appliquer cette valeur à la dernière colonne de la ColumnModel, 2)
returns wrong PreferredSize in some conditions
- pour mieux aider plus tôt un post court, praticable et compilable SSCCEOriginalL'auteur SAP