मैं उत्तर https://stackoverflow.com/a/5820366 और http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/ का उपयोग कर रहा हूं और यह काम करता है, लेकिन अक्सर कॉलम के आकार बहुत व्यापक या बहुत संकीर्ण होते हैं।स्तंभ कक्षों में सबसे लंबी सामग्री फिट करने के लिए जेटीबल कॉलम को कैसे समायोजित करें
कोई फर्क नहीं पड़ता कि मेरी तालिका HTML या टेक्स्ट के साथ भर रही है।
ओरेकल दस्तावेज़ीकरण से मानक TableModel
का उपयोग करना।
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));
एचटीएमएल उदाहरण:
"<html><pre><font size=+1 face='Arial'>" + firstValue + "\n" + secondValue + "</font></pre></html>"
सरल पंक्ति:
firstValue + " - " + secondValue
यहाँ है
आकार मोड = JTable.AUTO_RESIZE_OFF
मेरी तालिका के कंटेनर jGoodies है टी वह उदाहरण:
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;
}
}
मैं पंक्ति की ऊँचाई समायोजन के साथ इस तरह के समस्या है। <br>
निश्चित पंक्ति समायोजन के बजाय <pre>\n</pre>
का उपयोग करना।
का रीड होता मैं भी jxtable की packAll का उपयोग कर की कोशिश की है, लेकिन यह JTable तरह बर्ताव करता है कभी-कभी कटौती पाठ से बाहर और कभी-कभी बहुत पैडिंग – trickster77777
छोड़ देता है आपको कॉलम ग्रिड (जैसे 1 अतिरिक्त पिक्सेल) में जोड़ना पड़ सकता है और/या कुछ अतिरिक्त पैडिंग में जोड़ना पड़ सकता है। इसके लिए अच्छी तरह से काम करने के लिए, सुनिश्चित करें कि आप एक निश्चित चौड़ाई फ़ॉन्ट का उपयोग कर रहे हैं। – MadProgrammer
आप निश्चित चौड़ाई फ़ॉन्ट का क्या मतलब है? मैं तालिका को गतिशील रूप से भर रहा हूं और मुझे अगली सामग्री की चौड़ाई नहीं पता है। अगर मैं setRowHeight का उपयोग करता हूं, तो गलत कॉलम चौड़ाई अधिक बार प्रकट होती है और मैं समझ नहीं पा रहा हूं कि इससे संबंधित कैसे है। – trickster77777