【问题标题】:Make JTable cells perfectly square使 JTable 单元格完全正方形
【发布时间】:2020-08-13 11:40:18
【问题描述】:

是否有任何机制可以使 JTable 的单元格完全正方形?目前我只是在表的实现中覆盖了这个方法:

@Override
public int getRowHeight() {
    return this.getColumnModel().getColumn(0).getWidth();
}

这在大多数情况下都有效,如下图所示,我有一个 15x15 的 JTable:

但是,如果我扩展 JPanel,表格位于宽度方向,单元格的宽度和长度将继续扩展,导致下面的 3 行被切断:

我想知道是否有更好的解决方案让 JTable 的单元格完全正方形?

【问题讨论】:

  • 当发生调整大小时,确保使用两种尺寸(宽度和高度)中较小的一个来定义单元格尺寸?
  • 所以还要覆盖getRowHeight?只是想确保我理解正确
  • @sorfiend 我试过这样做,结果是这样的: return Math.min(super.rowHeight, this.getColumnModel().getColumn(0).getWidth());
  • 我的意思是你要么需要捕获调整大小事件,要么考虑窗口大小大小,然后使用一些逻辑来计算宽度或高度是否更小(限制因素)。然后根据哪个更小,您可以更改单元格的大小。例如,如果高度较小,则需要使用cellSize = windowHight / cellsCount,或者如果宽度较小,则需要使用cellSize = windowWidth / cellsCount

标签: java swing jtable swingutilities


【解决方案1】:

在我的评论中,您需要使用一些逻辑来确定宽度或高度是否更小(限制因素)。然后根据哪个更小,您可以更改单元格的大小。

我建议不要在行高上使用覆盖并试图弄乱列覆盖,而是建议拦截 JTable componentResized 事件并简单地设置我们想要的大小。对于这个例子,我假设了固定数量的单元格 (15x15):

int rowCount = 15;
int colCount = 15;

your_JTable.addComponentListener(new ComponentAdapter(){

    @Override
    public void componentResized(ComponentEvent e){
        //Get new JTable component size
        Dimension size = getSize();
        
        int cellSize;

        //Check if height or width is the limiting factor and set cell size accordingly
        if (size.height / rowCount > size.width / colCount){
            cellSize = size.width / colCount;
        }
        else{
            cellSize = size.height / rowCount;
        }
        
        //Set new row height to our new size
        setRowHeight(cellSize);
        
        //Set new column width to our new size
        for (int i = 0; i < getColumnCount(); i++){
            getColumnModel().getColumn(i).setMaxWidth(cellSize);
        }
    }
});

当水平或垂直或同时调整大小时,这在 JDK13 中提供了完美的方形单元格。我意识到我也回答了你的previous question,所以这是一个使用该代码的工作示例:

【讨论】:

  • 这很好用。有两件事要考虑。首先,如果您使表格非常小​​,可能会引发“新行高度小于 1”的错误,这是一个非常简单的解决方法,只需确保 cellSize 始终大于 1。其次,如果您没有行/columns 作为类属性可以只调用 getRowCount() 和 getColCount() 吗?
  • @219CID 最小尺寸的良好定位。是的,如果在调整大小事件期间没有添加新的行/列,getRowCount()getColCount() 应该没有问题。
猜你喜欢
  • 2012-05-03
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2017-12-12
  • 2016-06-26
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多