代码之家  ›  专栏  ›  技术社区  ›  Carlo del Mundo

javaswing;嵌入JScrolledPane的JTable的水平滚动问题

  •  2
  • Carlo del Mundo  · 技术社区  · 14 年前

    我遵循了本指南中的一些提示: JTable with horizontal scrollbar

    我有两个列标题:Name和Description(为了我们在本例中的目的)

    我想能够水平滚动每当一个条目被添加(即:名称/描述只有一行)。然而,Swing似乎并没有默认这种行为!

    我在滚动窗格中嵌入了一个JTable。JScrollPane具有以下参数:JScrollPane.VERTICAL\u滚动条(根据需要)以及JScrollPane.HORIZONTAL\u滚动条(根据需要)

    如果禁用: myTable.AutoResizeMode(AUTO_RESIZE_OFF)

    我怎么能有自动调整大小,但水平滚动仍然工作?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Alain BECKER    12 年前

    您可以按如下方式扩展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
  •   Geoffrey Zheng    14 年前

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

    JTable .

    退房 JXTable 看看它是否符合你的要求(我自己没用过)。

        3
  •  1
  •   trashgod    14 年前

    一种方法是 setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS) setPreferredScrollableViewportSize() 指定所需的大小。在你之后 pack() 窗户,用 setAutoResizeMode(JTable.AUTO_RESIZE_OFF) 允许水平滚动。

        4
  •  1
  •   trashgod    14 年前

    如果禁用: myTable.AutoResizeMode模式(自动调整大小关闭) 列标题不会填充 整张桌子(可能只有桌子的1/2) 表)。

    JTable

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

    我必须手动调整 “说明”一栏看全

    Table Column Adjuster 自动计算描述列的最大宽度