【发布时间】:2013-02-22 00:40:28
【问题描述】:
我遇到了一个之前在这里讨论过的问题:得到一个包含JTable 的JScrollPane 来显示我想要的水平滚动条。 HERE 是我尝试关注的帖子,但由于某种原因,它似乎不适用于我的情况(我认为这是因为我已将其中一个列设置为具有固定宽度。
这是一个 SSCCE:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class TableScrollTest extends JFrame
{
public TableScrollTest() {
DefaultTableModel model = new DefaultTableModel(new Object[]{"key", "value"},0);
model.addRow(new Object[]{"short", "blah"});
model.addRow(new Object[]{"long", "blah blah blah blah blah blah blah"});
JTable table = new JTable(model) {
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.getColumn("key").setPreferredWidth(60);
table.getColumn("key").setMinWidth(60);
table.getColumn("key").setMaxWidth(60);
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
}
public static void main(String[] args) {
TableScrollTest frame = new TableScrollTest();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setSize(200, 200);
frame.setResizable(false);
frame.setVisible(true);
}
}
简而言之,我有一个用于显示键/值对的两列表。存放表格的容器是固定宽度的,表格的第一列也是固定宽度的(因为我知道所有键名的长度)。第二列将包含不同字符串长度的值。仅当存在的值太长而无法适应为列分配的宽度时,才会出现水平滚动条。
因为上面的第二个值有这么长的长度,滚动条应该是可见的。然而,事实并非如此,我所尝试的一切都只是成功地让它始终可见,这不是我想要的......我只希望它在存在“长”值的情况下可见。似乎getScrollableTracksViewportWidth() 方法在表构造函数中被覆盖检查表的首选宽度是什么......所以我需要以某种方式指示表只根据第二列的内容选择更大的宽度.. . 但我很难过。
有什么想法吗?
【问题讨论】:
-
你的直接问题是因为你已经覆盖了
getScrollableTracksViewportWidth,这意味着表格永远不会比滚动窗格更宽...... -
@MadProgrammer 你确定吗?我链接的示例覆盖了该方法,在该示例中,表格确实比滚动窗格更宽。
-
但是table的preferredWidth是基于
TableColumn的宽度,没有考虑到内容的宽度,也就是说除非你把第二列的宽度改成一样您更改第一个的方式,它将始终返回true。我删除了getScrollableTracksViewportWidth方法并手动调整了列的大小,并且能够显示水平滚动条。 -
@MadProgrammer 好的,我明白你在说什么。看来我的目标是强制单元格渲染器自动使单元格适合长字符串,所以我不必像上面那样手动调整它的大小。
标签: java swing jtable jscrollpane tablecolumn