如何使 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 自动调整大小和水平滚动?的主要内容,如果未能解决你的问题,请参考以下文章