Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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单元格完全成正方形_Java_Swing_Jtable_Swingutilities - Fatal编程技术网

Java 使JTable单元格完全成正方形

Java 使JTable单元格完全成正方形,java,swing,jtable,swingutilities,Java,Swing,Jtable,Swingutilities,有什么机制可以使JTable的单元格完全成正方形吗?目前,我只是在表的实现中重写此方法: @Override public int getRowHeight() { return this.getColumnModel().getColumn(0).getWidth(); } 这在大多数情况下都有效,如下图所示,我有一个15x15 JTable: 但是,如果我扩展JPanel,则该表位于宽度方向上,单元格将继续扩展宽度和长度方向,导致较低的3行被截断: 我想知道是否有更好的解决方案

有什么机制可以使JTable的单元格完全成正方形吗?目前,我只是在表的实现中重写此方法:

@Override
public int getRowHeight() {
    return this.getColumnModel().getColumn(0).getWidth();
}
这在大多数情况下都有效,如下图所示,我有一个15x15 JTable:

但是,如果我扩展JPanel,则该表位于宽度方向上,单元格将继续扩展宽度和长度方向,导致较低的3行被截断:


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

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

我没有在行高度上使用覆盖并试图破坏列覆盖,而是建议拦截JTable
ComponentResistized
事件,并简单地设置我们想要的大小。在此示例中,我假设固定数量的单元(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);
        }
    }
});
int rowCount=15;
int colCount=15;
您的JTable.addComponentListener(新的ComponentAdapter(){
@凌驾
公共无效组件已恢复(组件事件e){
//获取新的JTable组件大小
维度大小=getSize();
细胞大小;
//检查高度或宽度是否为限制因素,并相应设置单元格大小
如果(size.height/rowCount>size.width/colCount){
cellSize=size.width/colCount;
}
否则{
cellSize=size.height/行数;
}
//将新的行高度设置为新的大小
设置行高(单元格大小);
//将新列宽设置为新大小
对于(int i=0;i
当水平或垂直或同时调整大小时,这在JDK13中提供了完美的方形单元格。我意识到我也回答了您的问题,因此下面是一个使用该代码的工作示例:


调整大小时,请确保使用两个大小(宽度和高度)中较小的一个来定义单元格大小?因此是否另外覆盖getRowHeight?只是想确保我能理解correctly@sorifiend我试着这样做,结果是:return Math.min(super.rowHeight,this.getColumnModel().getColumn(0.getWidth());我的意思是,您需要捕获调整大小事件,或者考虑窗口大小,然后使用一些逻辑来计算宽度或高度是否更小(限制因素)。然后根据哪个更小,您可以更改单元格的大小。例如,如果高度较小,则需要执行
cellSize=windowHight/cellsunt
,或者如果宽度较小,则需要执行
cellSize=windowWidth/cellsunt
,这非常有效。有两件事要考虑。首先,如果您使表非常小,可能会抛出一个错误“新行高度小于1”,这是一个非常简单的修复方法,只需确保cellSize始终大于1即可。其次,如果您没有行/列作为类属性,那么只调用getRowCount()和getColCount()可以吗?@219CID很好地确定了最小大小。是的,如果在调整大小事件期间没有添加新行/列,则
getRowCount()
getColCount()
应该没有问题。