如何使 JTable 自动调整大小和水平滚动?

Posted

技术标签:

【中文标题】如何使 JTable 自动调整大小和水平滚动?【英文标题】:How to make JTable both AutoResize and horizontall scrollable? 【发布时间】:2011-08-31 14:04:39 【问题描述】:

我将 JTable 放入 JScrollPane 中

但是当我设置 JTable Auto Resizeable 时,它​​不会有水平滚动条。

如果我设置了AUTO_RESIZE_OFF,那么当列宽不够大时,Jtable不会填满其容器的宽度。

那么我该怎么做:

    当表格不够宽时,展开以填充其容器宽度 当表格足够宽时,使其可滚动。

谢谢

【问题讨论】:

【参考方案1】:

您需要自定义 Scrollable 界面的行为。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableHorizontal extends JFrame

    public TableHorizontal()
    
        final JTable table = new JTable(10, 5)
        
            public boolean getScrollableTracksViewportWidth()
            
                return getPreferredSize().width < getParent().getWidth();
            
        ;
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        final JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    

    public static void main(String[] args)
    
        TableHorizontal frame = new TableHorizontal();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setSize(400, 300);
        frame.setVisible(true);
    

上面的代码基本上按照组件的首选大小或视口大小来调整组件大小,以较大者为准。

【讨论】:

优秀知识+1,对于setSize -1 ahhh ...行,你的把戏 - 应该猜到很多了 :-) 但它不完整,妨碍调整列大小,请参阅 ***.com/q/15499255/203657 @kleopatra,我在回答更多问题时学习(并查看其他答案)。有关更新的方法,请参阅 ***.com/questions/15234691/…。【参考方案2】:

如果由于某种原因自定义 JTable 不是一个选项(例如,它可能在第三方代码中创建),您可以通过将其设置为在调整包含视口大小时在两种不同的 JTable AUTO_RESIZE 模式之间切换来实现相同的结果,例如:

jTable.getParent().addComponentListener(new ComponentAdapter() 
    @Override
    public void componentResized(final ComponentEvent e) 
        if (jTable.getPreferredSize().width < jTable.getParent().getWidth()) 
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
         else 
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        
    
);

【讨论】:

工作就像一个魅力!感谢您提供简单的解决方案。【参考方案3】:

我发现只需要包含

  table = new JTable(model);
  // this enables horizontal scroll bar
  table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );    

然后在计算出所需的视口宽度和高度后,包括

  frame.getContentPane().add(new JScrollPane(table))
  table.setPreferredScrollableViewportSize(new Dimension(width,height));

【讨论】:

【参考方案4】:

如果您将其容器的 Layout 设置为 BorderLayout 并带有 BorderLayout.CENTER 布局约束,则 JTable 将自动调整大小以适应其容器。

如果你想让一个组件可滚动,你可以用JScrollPane包装JTable。

setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);

【讨论】:

这只会自动调整宽度而不是高度。如何让它自动调整高度?

以上是关于如何使 JTable 自动调整大小和水平滚动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xcode 自动布局中使对象自动调整大小?

水平图像滚动,图像大小调整以适合高度显示空白空间

如何在 Qt 设计器中使控件自动调整大小?

如何通过调整大小功能使 ag 网格标题具有粘性和响应性

Xamarin iOS Autolayout:自动调整各种设备的宽度和垂直滚动,同时保持水平滚动禁用演示链接

JTable中的换行,右对齐,自动调整行高