我遵循了本指南中的一些提示:JTable with horizontal scrollbar但仍然有问题。
我有两个列标题:名称和说明(用于本示例中的目的。)
我希望能够在添加条目时水平滚动(即:名称/描述只有 1 行)。然而,Swing 似乎并没有默认这种行为!
我有一个嵌入 ScrollPane 中的 JTable。 JScrollPane 具有以下参数:JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED 和 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
如果我禁用:myTable.AutoResizeMode(AUTO_RESIZE_OFF)
,列标题不会填满整个表格(可能只是表格的 1/2)。我必须手动调整“描述”列的大小才能看到整个内容。
如何在自动调整大小的同时水平滚动仍然有效?
最佳答案
您可以按如下方式扩展 JTable:
public class JHorizontalFriendlyTable extends JTable {
@Override
public Dimension getPreferredSize() {
if (getParent () instanceof JViewport) {
if (
((JViewport) getParent()).getWidth() > super.getPreferredSize().width)
) {
return getMinimumSize();
}
}
return super.getPreferredSize();
}
@Override
public boolean getScrollableTracksViewportWidth () {
if (autoResizeMode != AUTO_RESIZE_OFF) {
if (getParent() instanceof JViewport) {
return (((JViewport) getParent()).getWidth() > getPreferredSize().width);
}
return true;
}
return false;
}
}
示例用法:
jScrollPane1 = new JScrollPane();
TableModel jTable1Model = new DefaultTableModel(...);
JTable jTable1 = new JHorizontalFriendlyTable();
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane1.setViewPortView(jTable1);
jTable1.setModel(jTable1Model);
jTable1.setPreferredSize(new java.awt.Dimension(1051,518));
jTable1.setPreferredScrollableViewPortSize(new java.awt.Dimension(1000,528));
jTable1.getSize(new java.awt.Dimension(1051, 528));
if (jTable1.getPreferredScrollableViewPortSize().getWidth() >
((JViewPort) jTable1.getParent()).getPreferredSize().getWidth())
{
jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
jTable1.doLayout();
}
jTable1.setDragEnabled(false);
jTable1.setColumnSelectionAllowed(false);
jTable1.getTableHeader().setReorderingAllowed(false);
关于Java Swing ; JScrolledPane 中嵌入的 JTable 的水平滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857807/