2012-05-29 21 views
3

我试图阻止我的JTable被重新调整大小的方式,其标题小于他们所持有的文本的大小。我遇到的问题是,我得到的每个头部组件的最小首选宽度仅为10,当每个头部组件中的值是“头1”,“头2”,“头3”等时,这显然太小上。如何获得JTable列标题组件的最小首选宽度,以便它的大小不能小于值?

我花了很多时间搜索和尝试实施各种建议,但还没有设法遇到一个解决方案。请参阅当前的代码我使用的是除了我的扩展的JTable:

public class MyTable extends JTable { 

private Map<Integer, Integer> minSizeMap; 

public void calculateMinColumnSizes() { 

    int width = 0; 
    int row = 0; 
    minSizeMap = new HashMap<Integer, Integer>(); 

    for (int column = 0; column < columnModel.getColumnCount(); column++) { 
     TableColumn tableColumn = columnModel.getColumn(column); 
     TableCellRenderer renderer = tableColumn.getCellRenderer(); 
     Component comp = this.prepareRenderer(renderer, row, column); 
     width = Math.max(comp.getPreferredSize().width, width); 
     minSizeMap.put(tableColumn.getModelIndex(), width); 
    } 
    } 
} 

原代码来自克列奥帕特拉的回答How to resize JTable column to string length?,但我已经改变了部分截至目前我只想得到最小的首选宽度并将其存储以供调整大小后的比较。

在我调用方法之前,所有的模型都已经设置好了,所以我对当组件的首选宽度为10时感到有点困惑,当时TableColumn的minWidth和preferredWidth默认值分别是15和75。

任何想法,我做了什么/理解错了吗?

+0

猜测,但宽度= Math.max(comp.getPreferredSize()。宽度,column.getPreferredSize()。宽度) –

回答

6

我看到几个问题,在您的代码:

  1. 不要使用表格标题渲染器,但TableColumn的单元格渲染器(它们可以是不同的)
  2. 您第一次测试的首选大小行,而不是报头
  3. 您使用width = Math.max(comp.getPreferredSize().width, width);这根本没有任何意义

这里是一个片段,它应该让你去:


for (int column = 0; column < columnModel.getColumnCount(); column++) { 
    TableColumn tableColumn = columnModel.getColumn(column); 
    TableCellRenderer renderer = tableColumn.getHeaderRenderer(); 
    if (renderer == null) { 
     renderer = getTableHeader().getDefaultRenderer(); 
    } 
    Component component = renderer.getTableCellRendererComponent(this, 
      tableColumn.getHeaderValue(), false, false, -1, column); 
    minSizeMap.put(tableColumn.getModelIndex(), component.getPreferredSize().width); 
} 
+0

谢谢,您的片段并获得成功。出于兴趣,渲染器如何不同?由于标题使用相同的列模型,所以我认为渲染器也是一样的。是否有你使用getTableCellRendererComponent而不是JTable本身的prepareRenderer的原因? – LDM91

+0

@ LDM91'prepareRenderer'最终调用'getTableCellRendererComponent'。由于prepateRenderer中的信息是上下文的,所以它没有多大意义,但是您可以使用prepareRenderer解决这个问题。至于渲染者,你有可能使它们不同或相同,所以为了正确,让我们选择穷举选项而不是特定情况。 –

相关问题