Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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 JFrame调整大小时,JTable列可能不会调整大小_Java_Swing_Resize_Jtable - Fatal编程技术网

Java JFrame调整大小时,JTable列可能不会调整大小

Java JFrame调整大小时,JTable列可能不会调整大小,java,swing,resize,jtable,Java,Swing,Resize,Jtable,我得到了一个JTable,我在最后一列应用了自动调整大小。当我向左或向右拖动列时,它会自动调整最后一列的大小。。 但是,JTable通过BorderLayout管理器连接到JPanel。当我调整JFrame的大小时,JPanel会调整大小,因为JTable填充了JPanel,所以JTable也会调整大小。但是当我调整JFrame的大小时,AUTO_resize_LAST_列不起作用,而是调整所有列的大小 当JFrame改变大小时,我希望它只自动调整最后一列的大小,而不是调整所有列的大小。 代


我得到了一个JTable,我在最后一列应用了自动调整大小。当我向左或向右拖动列时,它会自动调整最后一列的大小。。
但是,JTable通过BorderLayout管理器连接到JPanel。当我调整JFrame的大小时,JPanel会调整大小,因为JTable填充了JPanel,所以JTable也会调整大小。但是当我调整JFrame的大小时,AUTO_resize_LAST_列不起作用,而是调整所有列的大小

当JFrame改变大小时,我希望它只自动调整最后一列的大小,而不是调整所有列的大小。

代码:

import java.awt.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类JTableResize扩展了JFrame{
专用JTable表;
私人JPanel小组;
私有JScrollPane;
DefaultTableModel=新的DefaultTableModel();
公共JTableResize(){
超级(“JTable-Resize问题”);
setLayout(新的BorderLayout());
panel=新的JPanel();
panel.setLayout(新的BorderLayout());
面板.立根背景(颜色.红色);
添加(面板、边框布局、中心);
表=新JTable(型号);
//面板。添加(表);
model.addColumn(“调整大小”);
model.addColumn(“问题”);
模型.添加柱(“……”);
model.addColumn(“这应该调整大小”);
窗格=新的JScrollPane(表);
面板。添加(面板);
//这应该是调整最后一列的大小。当您在列中拖动时,它起作用,但在调整框架大小时不起作用
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
table.getTableHeader().setReorderingAllowed(false);
表1.设置显示(假);

对于(int i=0;i请从
JTable
doLayout()
方法中查看API文档

在布局开始之前,该方法获取tableHeader的resizingColumn。当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小发生在JTable和change(更改)或delta(增量)的“外部”-应分布到所有列,而不考虑此JTable的自动调整大小模式

因此,默认情况下不支持这种行为

重写JTable的doLayout()方法并将“resizing column”设置为最后一列似乎可以做到这一点:

@Override
public void doLayout()
{
    if (tableHeader != null)
    {
        TableColumn resizingColumn = tableHeader.getResizingColumn();
        //  Viewport size changed. Increase last columns width

        if (resizingColumn == null)
        {
            TableColumnModel tcm = getColumnModel();
            int lastColumn = tcm.getColumnCount() - 1;
            tableHeader.setResizingColumn( tcm.getColumn( lastColumn ) ) ;
        }
    }

    super.doLayout();
}

JTable
doLayout()
方法中查看API文档

在布局开始之前,该方法获取tableHeader的resizingColumn。当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小发生在JTable和change(更改)或delta(增量)的“外部”-应分布到所有列,而不考虑此JTable的自动调整大小模式

因此,默认情况下不支持这种行为

重写JTable的doLayout()方法并将“resizing column”设置为最后一列似乎可以做到这一点:

@Override
public void doLayout()
{
    if (tableHeader != null)
    {
        TableColumn resizingColumn = tableHeader.getResizingColumn();
        //  Viewport size changed. Increase last columns width

        if (resizingColumn == null)
        {
            TableColumnModel tcm = getColumnModel();
            int lastColumn = tcm.getColumnCount() - 1;
            tableHeader.setResizingColumn( tcm.getColumn( lastColumn ) ) ;
        }
    }

    super.doLayout();
}

我看不出您的代码有任何问题。!!!它工作得非常好。@Mac尝试运行它,并将窗口调整到右侧(使窗口更大)。您应该看到,JTable中的所有列都在调整大小。但我希望它只调整最后一列(最右侧)的大小。因此,当我将窗口变大时,只有最后一列会变大(扩展)。因此,当窗口变大时,前三列应调整大小:)下次,请改进原始问题,而不是创建新问题。@HovercraftFullOfEels我会记住=)。不过我删除了旧问题。我看不出你的代码有任何问题。!!!它工作得非常好。@Mac尝试运行它,并将窗口调整到右侧(使窗口变大)。您应该看到,JTable中的所有列都在调整大小。但我希望只调整最后一列(最右边)的大小。因此,当我将窗口变大时,只有最后一列会变大(扩展)。因此,当窗口变大时,前三列应该调整大小:)下次,请改进原始问题,而不是创建新问题。@HovercraftFullOfEels我会记住=)。不过我删除了旧问题。