JTable高度计算
JTable height calculation
解决方案
jtable.getHeight不包含header元素
jtable.getRowHeight 包括保证金
并且示例的实际高度为 15px,而不是 14px
更清楚的例子
RO 16
R1 16
R2 16
HEIGHT 48
INTERCELL java.awt.Dimension[width=1,height=1]
MARGIN 1
我有 3 行的 JTable。每行 16px。每行边距 1px。
所以我怀疑 table 高度应该是 16 + 1 + 16 + 1 + 16 = 50px
但是 getHeight returns 48px
我也做了街拍。每行实际上有 14px 高度。
怎么可能????
//headers for the table
String[] columns = new String[] {
"Id", "Name", "Hourly Rate", "Part Time"
};
//actual data for the table in a 2d array
Object[][] data = new Object[][] {
{1, "John", 40.0, false },
{2, "Rambo", 70.0, false },
{3, "Zorro", 60.0, true },
};
//create table with data
JTable table = new JTable(data, columns);
//add the table to the frame
this.add(table);
this.setTitle("Table Example");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
System.out.println("RO " + table.getRowHeight(0));
System.out.println("R1 " + table.getRowHeight(1));
System.out.println("R2 " + table.getRowHeight(2));
System.out.println("HEIGHT " + table.getHeight());
System.out.println("INTERCELL " + table.getIntercellSpacing());
System.out.println("MARGIN " + table.getRowMargin());
}
原题
我在滚动窗格中有一个带有 jtable 的简单测试框架。
table 最小高度小于实际高度。
header + 行 < 实际大小
胡说八道
val jtable = view.tableControl
val headerHeight = jtable.getTableHeader.getHeight
val rowsHeight = (0 until jtable.getRowCount()).foldLeft(0) { (heightAccumulator, counter) ⇒
println("Row " + counter + " height " + jtable.getRowHeight(counter))
jtable.getRowHeight(counter) + heightAccumulator
}
val rowsMargin = jtable.getRowMargin() * (jtable.getRowCount() - 1)
println("Actual height " + jtable.getHeight())
println("Header height " + headerHeight)
println("Margin height " + jtable.getRowMargin())
println("PreferredScrollableViewportSize" + jtable.getPreferredScrollableViewportSize())
println("Rows height " + rowsHeight)
println("Should be at least: " + (rowsHeight + headerHeight + rowsMargin))
我得到了
Row 0 height 16
Row 1 height 16
Row 2 height 16
Row 3 height 16
Row 4 height 16
Actual height 80
Header height 19
Margin height 1
PreferredScrollableViewportSizejava.awt.Dimension[width=450,height=400]
Rows height 80
Should be at least: 103
JTable 位于框架内,没有任何滚动条。它是完全可见的,下面有很多 space。
怎么样?完全可见 table 的 jtable.getHeight()
如何可能 returns 高度小于 (rows * rowHeight + header)?
您可以替换您自己的 Scrollable
实现以获得各种效果。特别是,将 getPreferredScrollableViewportSize()
和 return 重写为行高的 suitable 倍数。设 N
为您希望滚动条显示在其后的行数。
JTable table = new JTable(tableModel) {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(SOME_WIDTH, N * table.getRowHeight());
}
};
将 table 添加到滚动窗格:
JScrollPane sp = new JScrollPane(table);
将窗格添加到布局符合首选大小的面板:
JPanel p = new JPanel(new GridLayout());
p.add(sp);
超过N
行的table会显示滚动条,如图here.
I just want to find the actual table height [in the context of] unit tests from the huge project.
我不知道你的总高度计算是如何失败的,但结果不可避免地会根据用户的平台、选择的外观和组件验证状态而改变;建议使用错误的方法 here。相反,尝试通过使用上述方法确保特定数量的 行 可见来满足测试要求。
How? How jtable.getHeight() of fully visible table may returns height less then (rows * rowHeight + header)?
JTable 有一个默认的首选大小,它在创建 table 时被硬编码,因为 table 通常被添加到 JScrollPane 的视口中。正如您所看到的,首选视口大小比您需要的小 table 大得多,这将占额外的 space.
如果您有一个小 table 并且您希望它以最小尺寸完全显示,那么您可以使用如下代码:
JTable table = new JTable(...);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
解决方案
jtable.getHeight不包含header元素
jtable.getRowHeight 包括保证金
并且示例的实际高度为 15px,而不是 14px
更清楚的例子
RO 16
R1 16
R2 16
HEIGHT 48
INTERCELL java.awt.Dimension[width=1,height=1]
MARGIN 1
我有 3 行的 JTable。每行 16px。每行边距 1px。 所以我怀疑 table 高度应该是 16 + 1 + 16 + 1 + 16 = 50px
但是 getHeight returns 48px
我也做了街拍。每行实际上有 14px 高度。
怎么可能????
//headers for the table
String[] columns = new String[] {
"Id", "Name", "Hourly Rate", "Part Time"
};
//actual data for the table in a 2d array
Object[][] data = new Object[][] {
{1, "John", 40.0, false },
{2, "Rambo", 70.0, false },
{3, "Zorro", 60.0, true },
};
//create table with data
JTable table = new JTable(data, columns);
//add the table to the frame
this.add(table);
this.setTitle("Table Example");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
System.out.println("RO " + table.getRowHeight(0));
System.out.println("R1 " + table.getRowHeight(1));
System.out.println("R2 " + table.getRowHeight(2));
System.out.println("HEIGHT " + table.getHeight());
System.out.println("INTERCELL " + table.getIntercellSpacing());
System.out.println("MARGIN " + table.getRowMargin());
}
原题
我在滚动窗格中有一个带有 jtable 的简单测试框架。
table 最小高度小于实际高度。 header + 行 < 实际大小
胡说八道
val jtable = view.tableControl
val headerHeight = jtable.getTableHeader.getHeight
val rowsHeight = (0 until jtable.getRowCount()).foldLeft(0) { (heightAccumulator, counter) ⇒
println("Row " + counter + " height " + jtable.getRowHeight(counter))
jtable.getRowHeight(counter) + heightAccumulator
}
val rowsMargin = jtable.getRowMargin() * (jtable.getRowCount() - 1)
println("Actual height " + jtable.getHeight())
println("Header height " + headerHeight)
println("Margin height " + jtable.getRowMargin())
println("PreferredScrollableViewportSize" + jtable.getPreferredScrollableViewportSize())
println("Rows height " + rowsHeight)
println("Should be at least: " + (rowsHeight + headerHeight + rowsMargin))
我得到了
Row 0 height 16
Row 1 height 16
Row 2 height 16
Row 3 height 16
Row 4 height 16
Actual height 80
Header height 19
Margin height 1
PreferredScrollableViewportSizejava.awt.Dimension[width=450,height=400]
Rows height 80
Should be at least: 103
JTable 位于框架内,没有任何滚动条。它是完全可见的,下面有很多 space。
怎么样?完全可见 table 的 jtable.getHeight()
如何可能 returns 高度小于 (rows * rowHeight + header)?
您可以替换您自己的 Scrollable
实现以获得各种效果。特别是,将 getPreferredScrollableViewportSize()
和 return 重写为行高的 suitable 倍数。设 N
为您希望滚动条显示在其后的行数。
JTable table = new JTable(tableModel) {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(SOME_WIDTH, N * table.getRowHeight());
}
};
将 table 添加到滚动窗格:
JScrollPane sp = new JScrollPane(table);
将窗格添加到布局符合首选大小的面板:
JPanel p = new JPanel(new GridLayout());
p.add(sp);
超过N
行的table会显示滚动条,如图here.
I just want to find the actual table height [in the context of] unit tests from the huge project.
我不知道你的总高度计算是如何失败的,但结果不可避免地会根据用户的平台、选择的外观和组件验证状态而改变;建议使用错误的方法 here。相反,尝试通过使用上述方法确保特定数量的 行 可见来满足测试要求。
How? How jtable.getHeight() of fully visible table may returns height less then (rows * rowHeight + header)?
JTable 有一个默认的首选大小,它在创建 table 时被硬编码,因为 table 通常被添加到 JScrollPane 的视口中。正如您所看到的,首选视口大小比您需要的小 table 大得多,这将占额外的 space.
如果您有一个小 table 并且您希望它以最小尺寸完全显示,那么您可以使用如下代码:
JTable table = new JTable(...);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );