Java Swing;嵌入在JScrolledPane中的JTable的水平滚动问题

时间:2010-10-04 17:53:07

标签: java swing

我遵循了本指南中的一些提示: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)。我必须手动调整“描述”列的大小以查看整个事情。

如何进行自动调整,但水平滚动仍然有效?

4 个答案:

答案 0 :(得分:2)

一种方法可能是在创建表格时使用setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS),然后使用setPreferredScrollableViewportSize()指定所需的大小。在pack()窗口后,使用setAutoResizeMode(JTable.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);

答案 2 :(得分:1)

自动调整大小意味着自动调整大小以避免滚动。

因此标准JTable的答案是否定的。

查看JXTable并查看它是否符合您的要求(我自己没有使用过它)。

答案 3 :(得分:1)

  

如果我禁用:   myTable.AutoResizeMode(AUTO_RESIZE_OFF)   列标题没有填满   整张桌子(也许只是其中的一半)   表)。

默认情况下,每列只有75像素宽。您可以将描述列的宽度更改为您想要的任何内容。阅读JTable API,您将找到关于“如何使用表格”的Swing教程的链接,该教程解释了如何执行此操作。

但是,即使使用此方法,如果用户调整帧大小,列大小也不会改变。您想要处理这种情况,然后需要向表中添加ComponentListener(或者可能是滚动窗格)。然后,每当触发componentResized()方法时,您可以总计两列的宽度,然后根据需要调整描述列的宽度,以确保列总宽度不小于表的宽度。

  

我必须手动调整大小   “描述”栏目看整体   的事情。

如果您知道您的描述列总是足够大以填充滚动窗格的视口,那么您可以使用Table Column Adjuster自动计算描述列的最大宽度