如何使JTable既可自动调整大小又可水平滚动?

| 我正在将JTable放入JScrollPane 但是当我设置JTable Auto Resizeable时,它将没有水平滚动条。 如果我设置了AUTO_RESIZE_OFF,那么当列宽不够大时,Jtable将不会填充其容器的宽度。 所以我该怎么做: 当表格不够宽时,展开以填充其容器宽度 当表格足够宽时,使其可滚动。 谢谢     
已邀请:
您需要自定义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);
    }
}
上面的代码基本上按其首选大小或视口大小(以较大者为准)调整组件的大小。     
如果出于某种原因不能自定义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);
        }
    }
});
    
我发现所需要做的就是包括
  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));
    
如果使用BorderLayout.CENTER布局约束将其容器的Layout设置为BorderLayout,则JTable将自动调整大小以适合其容器。 如果要使组件可滚动,则可以用JScrollPane包装JTable。
setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);
    

要回复问题请先登录注册