TableColumn setPreferredWidth不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TableColumn setPreferredWidth不起作用相关的知识,希望对你有一定的参考价值。

我有一个带有多个列的JTable。我想要一个特定的列来调整大小。我希望通过使用setPreferredWidth,列将调整大小,或者内容的大小,以便不发生截断,让其余列占用剩余空间,而是所有列,包括一个我调整大小,同样分开桌子的所有空间;好像setPreferredWidth什么也没做。实际上,我希望能够设置列的宽度并使其缩小到该大小而不截断内容(我是否已经强调了太多?)以这种方式使所有未调整大小的列填充剩余的空间。使用setMaxWidth截断内容(我提到过我不喜欢它吗?)如何在没有截断的情况下重新调整/缩小列,如果没有它完全没有做什么?这是违规代码:

for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++)
    if ((x = model.getColumnWidth(i)) > -1)
        table.getColumnModel().getColumn(i).setPreferredWidth(x);

该表位于JPanel(MyListPanel - BorderLayout)中,该JPanel在另一个JPanel(GridBagLayout)中添加了:

new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 0, 2), 0, 0))

编辑:这是我的JPanel子类的构造函数:

public MyListPanel(boolean showHeader, String title, ColData...columns) {
    super(new BorderLayout());
    model = new MyListTableModel(columns);
    table = new JTable(model);

    table.addFocusListener(this);

    add(table);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    setTitle(title);

    if (showHeader)
        add(table.getTableHeader(), BorderLayout.NORTH);

    for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++)
        if ((x = model.getColumnWidth(i)) > -1)
            table.getColumnModel().getColumn(i).setPreferredWidth(x);

    setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
}

和MyListTableModel.ColData:

public static class ColData {
    private int index;
    private String title;
    private int width;
    public ColData(int _index, String _title, int _width) { index = _index; title = _title; width = _width; }
}
答案

包括:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
另一答案

尽管在这里尝试了另外两个答案,我也有类似的问题。在我的情况下,有时宽度将被正确设置,而有时,它不会。我发现问题是由于我在更改表模型后尝试立即设置列宽。我发现在SwingUtilities.invokeLater()中设置列宽可以解决问题。 I.E.

SwingUtilities.invokeLater(new Runnable(){

    @Override
    public void run() {
         int width = 100;  
         for (int column = 1; column < table.getColumnCount(); column++) {
             columnModel.getColumn(column).setPreferredWidth(width);
         }
    }
}
另一答案

我知道这有点晚了所以主要是为了未来的读者,但我遇到了同样的问题并通过将列的首选宽度和最大宽度设置为相同的值来解决它。

另一答案

我有同样的问题和阅读@Jay Askren的回答,相反对我有用。我必须在创建表的方法中设置宽度。

public class Example{
    //..stuff
    private JTable myTable;

    public Example{
    //..stuff
    myTable = AnotherClass.getTable();
    myTable .getColumnModel().getColumn(0).setPreferredWidth(100);//not here
    }

}

public class AnotherClass{
    public static JTable getTable(){
    JTable table= new JTable();
    table.setModel(anyModel);
    table.getColumnModel().getColumn(0).setPreferredWidth(100);//Here!
    return table
   }
}
另一答案

设置setMinWidth,setMaxWidth和setPreferredWidth的全部三个,其中minimum_width <= preferred_width <= maximum_width。

        int[] minColSizes       = { 15,  55,  75,  50,  50,  50 };
        int[] preferredColSizes = { 25,  75, 125, 100, 100, 100 };
        int[] maxSizes          = { 50, 100, 200, 200, 200, 200 };
        for ( int index = 0; index < preferredColSizes.length; index++ )
        {
            myTable.getColumnModel().getColumn(index).setMinWidth ( minColSizes[index] );
            myTable.getColumnModel().getColumn(index).setMaxWidth ( preferredColSizes[index] + 100 );
            myTable.getColumnModel().getColumn(index).setPreferredWidth ( maxSizes[index] );
        }

以上是关于TableColumn setPreferredWidth不起作用的主要内容,如果未能解决你的问题,请参考以下文章

php TableColumn来

向 Tableview Javafx 动态添加和删除 tablecolumn

TableColumn setPreferredWidth不起作用

JTable和JTable的TableColumn中的BeansBinding

element UI实现动态生成多级表头

Design6:选择合适的数据类型