当前位置: 首页 > 面试题库 >

具有自动调整大小,水平滚动和可收缩第一列的JTable

赵鸿畴
2023-03-14
问题内容

我在使用滚动条创建JTable时遇到问题。我想要一个具有2列且没有可见滚动条的JTable。

如果我放大其中一列,则滚动条应该变得可见,并且列的大小也将重新调整。

我遵循此答案如何使JTable既可自动调整大小又可水平滚动?并且工作正常,基本上可以归结为:

JTable table = new JTable() {
  @Override
  public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
  }
};
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

但是,使用此解决方案,我无法缩小第一列。仅当我放大第二列并且滚动条变得可见时,我才可以缩小第一列。

必需的行为是2列会自动调整大小。这意味着第1列可以缩小,然后再扩展,而不会弹出滚动条。仅当扩展一列时,视图才应扩展,滚动条才应弹出。

一个场景:

  1. 缩小第一列->第二列放大,没有滚动条
  2. 放大第一列->第二列缩小,但仍然没有滚动条
  3. 放大第二列-> 1列保持不变,第二列放大并出现滚动条

有解决此问题的想法吗?

SSCCE:

import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.Container;

public class TableTest {
public TableTest() {

JDialog mainDialog = new JDialog();
mainDialog.setResizable( true );
mainDialog.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
Container contentPane = mainDialog.getContentPane();

JTable myTable = new JTable() {
  @Override
  public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
  }
};

myTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
myTable.setModel( new MyTableModel() );
JScrollPane scrollPane = new JScrollPane( myTable );
contentPane.add( scrollPane, BorderLayout.CENTER );

mainDialog.pack();
mainDialog.setVisible( true );
}

public static void main( String[] args ) {
new TableTest();
}

private class MyTableModel extends AbstractTableModel {

@Override public int getRowCount() {
  return 1;
}

@Override public int getColumnCount() {
  return 2;
}

@Override public Object getValueAt( int rowIndex, int columnIndex ) {
  return "ARandomValue";
}
}
}

问题答案:

覆盖getTracks方法还不够,如果跟踪,您必须愚弄super的布局以使其正确无误:

JTable myTable = new JTable(10, 4) {
    private boolean inLayout;

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return hasExcessWidth();

    }


    @Override
    public void doLayout() {
        if (hasExcessWidth()) {
            // fool super
            autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
        }
        inLayout = true;
        super.doLayout();
        inLayout = false;
        autoResizeMode = AUTO_RESIZE_OFF;
    }


    protected boolean hasExcessWidth() {
        return getPreferredSize().width < getParent().getWidth();
    }

    @Override
    public void columnMarginChanged(ChangeEvent e) {
        if (isEditing()) {
            // JW: darn - cleanup to terminate editing ...
            removeEditor();
        }
        TableColumn resizingColumn = getTableHeader().getResizingColumn();
        // Need to do this here, before the parent's
        // layout manager calls getPreferredSize().
        if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
                && !inLayout) {
            resizingColumn.setPreferredWidth(resizingColumn.getWidth());
        }
        resizeAndRepaint();
    }

};

可能不是完全完整的(甚至在完成照顾columnMarginChanged的编辑之后,可能还不是全部),该编辑是从(SwingX项目的)JXTable复制而来的,它通过附加的layout属性支持该行为

xTable.setHorizontalScrollEnabled(true);


 类似资料:
  • 问题内容: 我正在将JTable放入JScrollPane 但是,当我设置JTable Auto Resizeable时,它将没有水平滚动条。 如果我设置了AUTO_RESIZE_OFF,那么当列宽不够大时,Jtable将不会填充其容器的宽度。 所以我该怎么做: 当表格不够宽时,展开以填充其容器宽度 当表格足够宽时,使其可滚动。 谢谢 问题答案: 您需要自定义Scrollable界面的行为。 上面

  • 问题内容: 我一直在尝试一种方法来制作具有固定的第一列的表(表的其余部分具有水平的溢出),我看到有类似问题的帖子。但是固定的列位似乎没有解决。帮帮我? 问题答案: 我有一个类似的样式,如下所示:

  • 我试图创建一个包含两列的gridview。我的意思是每排并排两张照片,就像这张图片一样。 但我的照片之间有空间,因为它的大小不一样。这是我得到的。 正如您所看到的,第一张图片隐藏了显示联系人姓名和电话号码的图例。其他图片未正确拉伸。 这是我的GridView xml文件。如您所见,< code>columnWidth被设置为200dp。我希望它是自动的,所以图片会自动调整每个屏幕的大小。 这里是项

  • 好吧,这里你是下一篇关于固定页眉和页脚的无聊滚动表的文章。这个主题来自超文本标记语言的刚性结构。源问题是显示非常巨大的表格溢出屏幕宽度作为高度。我的愿望也是将标题固定在表格的顶部,因此将其副本固定在表格的底部。 在大量搜索和测试保证代码后,我发现了下一个深层嵌套问题:-页眉和页脚没有保持表体的单元格间距,而tbody是单独滚动的-tbody行覆盖了页眉-tbody的垂直滚动很难与整个表(包括页眉和

  • 问题内容: Qt解决方案是对 resizeColumnsToContent() 的单个调用,在.NET中,可以使用 TextRenderer.MeasureText() ,而JTable可以使用 AUTO_RESIZE_ALL_COLUMNS 。 在SWT中,是否有一种方法可以在填充列之后以编程方式调整列的大小? 调用将返回相同的值,因此将忽略列中剩余的字符。 TableColumn具有,但是如何

  • 我想做的从右到左滚动与我猜将是一个recylcer视图,但不确定是否是这个。我只是需要有人给我指明正确的方向。我想我需要一个内部布局的回收视图。 如果有人能指点我在哪里找到答案,我会变得很伟大!