Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable使用动态大小设置列宽,并将JTextArea设置为单元格渲染器_Java_Swing_Jtable - Fatal编程技术网

Java JTable使用动态大小设置列宽,并将JTextArea设置为单元格渲染器

Java JTable使用动态大小设置列宽,并将JTextArea设置为单元格渲染器,java,swing,jtable,Java,Swing,Jtable,我想根据文本设置JTable列的动态大小。我想知道我设置为getColumnModel().getColumn(0)、setWidth(X)的每个X数字可以容纳多少个字符?(字体为Arial,字体大小为12) 我想知道我设置为getColumnModel().getColumn(0.setWidth(X)的每个X数;可以容纳多少个字符 您无法获得一般答案,因为字符串“iiiii”所占的像素数小于“wwwww”,因为每个字符所占的像素数不同 实际上,您需要单独确定每个单元格的大小,然后使用最大值。

我想根据文本设置JTable列的动态大小。我想知道我设置为
getColumnModel().getColumn(0)、setWidth(X)的每个
X
数字可以容纳多少个字符?(字体为Arial,字体大小为12)

我想知道我设置为getColumnModel().getColumn(0.setWidth(X)的每个X数;可以容纳多少个字符

您无法获得一般答案,因为字符串“iiiii”所占的像素数小于“wwwww”,因为每个字符所占的像素数不同

实际上,您需要单独确定每个单元格的大小,然后使用最大值。您可以在数据加载到表中后执行此操作

基本准则是:

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表=新的JTable(…);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for(int column=0;column=最大宽度)
{
首选宽度=最大宽度;
打破
}
}
tableColumn.setPreferredWidth(preferredWidth);
}
上面的代码将为每列提供一个静态宽度

另一个选择是使用。
表格列调整器
将上述逻辑与其他功能结合在一起,可用于确定列宽:

  • 根据标题中的数据,每个单元格或两个单元格
  • 静态(在数据加载到
    表格模型之后)或动态(在数据被编辑或添加到
    表格模型之后)
  • 这就是您所需要的:

    JTable table = new JTable(){
        @Override
           public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
               Component component = super.prepareRenderer(renderer, row, column);
               int rendererWidth = component.getPreferredSize().width;
               TableColumn tableColumn = getColumnModel().getColumn(column);
               tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
               return component;
            }
        };
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    

    表格将自动调整每一列的宽度以适应内容。无需控制何时触发调整大小。

    在渲染过程中不应更改组件的大小。您应该亲自尝试查看。它工作完美,我从来没有一个问题。这是目前为止满足这一需求的最佳解决方案。呈现代码的目的是呈现组件,而不是设置TableColumn的首选宽度。代码可能会处理从不更改的静态数据,在这种情况下,如果在加载数据后可以执行一次代码,则继续执行代码会增加开销。是的,如果数据更改,它会增加宽度,但不会减少宽度,因此列宽只能增加。根据要求,这可能是可以接受的。我有
    JTextArea
    作为渲染器<代码>getIntercellSpacing()。宽度始终返回1