Java 如何使JTable列大小与内容精确(或紧密)匹配?
我的程序的输出位于Java 如何使JTable列大小与内容精确(或紧密)匹配?,java,swing,jtable,Java,Swing,Jtable,我的程序的输出位于JTextArea中的JScrollPane中。看起来很恶心: 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\Dis
JTextArea
中的JScrollPane
中。看起来很恶心:
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 < 100; i++)
{
String c0 = Utilities.Utilities.repeat("x", (int) (Math.random()*50));
dftTableModel.addRow(new Object[]{((Math.sin(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;
}
因此,我不得不问:
(a) 具体来说,鉴于我知道k
是文件名
和'Path列中的字符数,我如何使这些列的内容与它们的列完全匹配?(我假设
font`size将进入图片。)
(b) 通常,如何更改JTable
中的列大小?例如,一列总是说“in”。如何使柱子不超过这个宽度
编辑
由于@camickr,无论是在上面的测试程序中还是在下面的实际输出中,都可以很容易地获得所需的输出:
请查看
可以根据以下内容设置列宽:
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 );
}
对于此外,您还需要启用自动列大小调整功能,有关详细信息,请参阅
JTable#setAutoResizeMode
details@camickr--谢谢你的及时回复。看起来不错。今天我已经有了它,但是快速通读代码是令人鼓舞的。我希望知道字体大小和字符数(使用Courier New的固定宽度,在我的代码中没有显示)可以使它只显示几行,但似乎没有什么比希望的更容易。@DSlomer64,您可以使用编辑中演示的代码来获得固定宽度字符的大小。但当然,您仍然需要遍历表中每列的所有行,以确定每列中的最大字符数。这里给出的解决方案适用于表可能使用的任何渲染器,因此它是一个更通用的解决方案。@camickr--感谢您共享tableColumnAdjulator
!昨晚看了423行代码后,我想我不可能很快就能用上它。今天早上我做的第一件事就是<代码>静态表tca声明它tca=新的TableColumnAdjulator。TableColumnAdjulator(tblOutput)
将myJTable链接到它;而tca.setDynamicAdjustment(true)
让魔法发生了。这花了一段时间把这些片段组合在一起,但我在OQ中的最后一次编辑显示了结果。
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 );