如何使JTable同时AutoResize和horizo​​ntall可滚动?

Leo*_*eon 25 java swing jtable autoresize

我将JTable放入JScrollPane

但是当我设置JTable Auto Resizeable时,它将没有水平滚动条.

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

那我该怎么做呢:

  1. 当桌子不够宽时,展开以填充其容器宽度
  2. 当表足够宽时,使其可滚动.

谢谢

cam*_*ckr 38

您需要自定义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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码基本上将组件的大小设置为其首选大小或视口大小,以较大者为准.

  • 啊......排,你的伎俩 - 应该猜到了这么多:-)但是它不完整,阻碍了列的大小调整,请参阅http://stackoverflow.com/q/15499255/203657 (2认同)
  • @kleopatra,我在回答更多问题时学习(并查看其他答案).有关更新的方法,请参见http://stackoverflow.com/questions/15234691/enabling-auto-resize-of-jtable-only-if-it-fit-viewport/15240806#15240806. (2认同)

gb9*_*b96 9

如果由于某种原因自定义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);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)