我正在将一个JTable放在一个JScrollPane中。
但是当我设置JTable自动调整大小时,它就不会有水平滚动条了。
如果我设置为AUTO_RESIZE_OFF,那么当列宽度不够大时,Jtable就无法填充其容器的宽度。
那么我该怎么做:
- 当表格宽度不足时,扩展以填充其容器宽度
- 当表格宽度足够时,使其可滚动。
谢谢
我正在将一个JTable放在一个JScrollPane中。
但是当我设置JTable自动调整大小时,它就不会有水平滚动条了。
如果我设置为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));
setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);