如何使JTable同时AutoResize和horizontall可滚动?
我将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布局约束将其容器的布局设置为BorderLayout ,则JTable将自动resize以适合其容器。
如果要使组件可滚动,可以使用JScrollPane包装JTable。
setLayout(new BorderLayout()); add(new JScrollPane(new JTable()), BorderLayout.CENTER);