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

标签 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)。我必须手动调整“描述”列的大小才能看到整个内容。

如何在自动调整大小的同时水平滚动仍然有效?

最佳答案

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

相关文章:

java - 正则表达式查询(运行时可定制)

java - JTextArea的Word不变色[JAVA]

java - 如何在Java中实现搜索 token (如mac Lion中)?

java - 如何从 Java Swing 应用程序退出,避免从 setInputVerifier 生成消息

java - 如何通过 Swing 中的中间面板使 View 居中

java - 更改另一个类的 JLabel 文本

java - 如何将变量传递给 .property 文件中引用的 JVM?

java - 写一个不扩展Application的javafx程序

java - Android-如何以编程方式检查 Intent 过滤器的类型?

java - Eclipse控制台不打印汉字