【问题标题】:Java Swing; Problems with Horizontal Scroll for a JTable embedded in a JScrolledPane爪哇摇摆;嵌入在 JScrolledPane 中的 JTable 的水平滚动问题
【发布时间】:2010-10-04 17:53:06
【问题描述】:

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

我怎样才能自动调整大小,但水平滚动仍然有效?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您可以按如下方式扩展 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】:

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

      所以答案是否定的标准JTable

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

      【讨论】:

        【解决方案3】:

        一种方法可能是在创建表时使用setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS),然后使用setPreferredScrollableViewportSize() 指定所需的大小。在pack() 窗口后,使用setAutoResizeMode(JTable.AUTO_RESIZE_OFF) 允许水平滚动。

        【讨论】:

          【解决方案4】:

          如果我禁用: myTable.AutoResizeMode(AUTO_RESIZE_OFF) 列标题没有填满 整张桌子(也许只有 1/2 表)。

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

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

          我必须手动调整 “说明”栏目看全 东西。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-23
            相关资源
            最近更新 更多