如何使JTable同时具有自动调整大小和水平滚动功能?

29

我正在将一个JTable放在一个JScrollPane中。

但是当我设置JTable自动调整大小时,它就不会有水平滚动条了。

如果我设置为AUTO_RESIZE_OFF,那么当列宽度不够大时,Jtable就无法填充其容器的宽度。

那么我该怎么做:

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

谢谢

4个回答

43

您需要自定义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
优秀的知识 +1,对于setSize -1。 - mKorbel
2
啊啊啊... Row,你的诀窍——早该猜到了 :-) 但是它不完整,妨碍了列的调整大小,请参见 https://dev59.com/3G_Xa4cB1Zd3GeqP5thL - kleopatra
2
@kleopatra,我在回答更多问题(并查看其他答案)时学习。请参见https://dev59.com/fWUp5IYBdhLWcg3wf3us#15240806获取更新的方法。 - camickr

11

如果由于某种原因,无法定制 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);
        }
    }
});

1
运行得非常好!感谢您提供简单的解决方案。 - Vova

2

我发现只需要包括以下内容:

  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));

0
如果您将其容器的布局设置为BorderLayout并使用BorderLayout.CENTER布局约束,则JTable将自动调整大小以适应其容器。
如果您想使组件可滚动,可以使用JScrollPane包装JTable。
setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);

这只能自动调整宽度,而不能自动调整高度。我该如何使其自动调整高度? - bbodenmiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接