如何准确(或紧密)拟合内容的JTable列大小?

我的程序的输出位于JScrollPane内的JTextArea 。 看起来很讨厌:

 Created BinaryTree.java in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\BinaryTree.java Created DisplayStuff.java in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\DisplayStuff.java Created LinkedList.java in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\LinkedList.java Created Node.java in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\Node.java Created notes in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\notes Created TryBinaryTree.java in I:\Netbeans OLDIES but KEEPIES\BinaryTree\src\binarytree\TryBinaryTree.java 

因此我考虑将输出放入JTable ,假设在执行结束时调整列大小并获得看起来更像电子表格的结果,因此更具可读性:

在此处输入图像描述

我以前从未使用过JTable ,所以我尝试了一个简单的程序,看看我是否可以创建一个JTable 。 我做到了。 这里是:

 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.WindowConstants; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; public class TestJTable { static void init() { fraFrame = new JFrame(); fraFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); dftTableModel = new DefaultTableModel(0 , 4); tblOutput = new JTable(dftTableModel); scrOutput = new JScrollPane(tblOutput); colMdl = tblOutput.getColumnModel(); fraFrame.add(scrOutput); // NOTE: add the SCROLL PANE, not table fraFrame.setVisible(true); fraFrame.pack(); } public static void main(String[] args) { init(); tblOutput.doLayout(); dftTableModel.addRow(new Object[]{"Action", "Filename", "", "Path"}); for (int i = 0; i  0 ? "Updated" : "Created"), c0, "in", c0}); k = Math.max(k, c0.length()); } } static int k; static JFrame fraFrame ; static JTable tblOutput; static DefaultTableModel dftTableModel; static JScrollPane scrOutput; static TableColumnModel colMdl; } 

这是输出:

在此处输入图像描述

我希望能够完全按照我的意愿设置列的大小。

一小时旋转我的车轮尺寸,首选尺寸,工作台尺寸,自动调整(而不是)使我在程序的不同部分尝试以下不同的组合,没有产生令人满意的结果,尽管取出pack有所帮助:

  fraFrame.setSize(1400, 600); tblOutput.setSize(1500,400); colMdl.getColumn(0).setPreferredWidth(15); colMdl.getColumn(1).setPreferredWidth(10*k); colMdl.getColumn(2).setPreferredWidth(5); colMdl.getColumn(3).setPreferredWidth(10*k); 

所以我要问:

(a)具体来说,鉴于我知道kFilename和路径columns, how can I make the contents of those columns be exactly fit their columns? (I assume的字符columns, how can I make the contents of those columns be exactly fit their columns? (I assume columns, how can I make the contents of those columns be exactly fit their columns? (I assume字体大小将进入图片。)

(b)通常,如何更改JTable的列大小? 例如,一列总是说“in”。 如何使专栏不宽于此?

编辑

感谢@camickr,在上面的测试程序和真实的输出中获得所需的输出很容易,输出如下:

在此处输入图像描述

查看表格列调整程序 。

您可以根据以下内容设置列宽:

  1. 专栏的标题
  2. 列的每一行中的数据
  3. 标题或数据中较大的一个

该类还支持其他function,以便在数据更改时允许动态resize。

或者您可以使用提供的基本代码, prepareRenderer(...)使用JTable的prepareRenderer(...)方法来确定最大宽度。

 JTable table = new JTable( ... ); table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); for (int column = 0; column < table.getColumnCount(); column++) { TableColumn tableColumn = table.getColumnModel().getColumn(column); int preferredWidth = tableColumn.getMinWidth(); int maxWidth = tableColumn.getMaxWidth(); for (int row = 0; row < table.getRowCount(); row++) { TableCellRenderer cellRenderer = table.getCellRenderer(row, column); Component c = table.prepareRenderer(cellRenderer, row, column); int width = c.getPreferredSize().width + table.getIntercellSpacing().width; preferredWidth = Math.max(preferredWidth, width); // We've exceeded the maximum width, no need to check other rows if (preferredWidth >= maxWidth) { preferredWidth = maxWidth; break; } } tableColumn.setPreferredWidth( preferredWidth ); } 

编辑:

我希望知道字体大小和字符数

 FontMetrics fm = table.getFontMetrics( table.getFont() ); int charWidth = fm.stringWidth("a"); System.out.println( charWidth );