Размер таблицы свинга Java - PullRequest
1 голос
/ 19 февраля 2009

У меня проблемы с JTables. Я добавляю две таблицы на панель, таблицы находятся внутри полосы прокрутки, но когда приложение появляется, таблицы всегда занимают больше места, чем количество строк, тратя впустую мое доступное пространство.

Я использую groovy и swingbuilder для создания таблиц, вот код:

scrollPane(){
    panel(layout: new MigLayout('wrap 3')) {
        //main title
        label(text: '<html><h1>blah</h1></html>',constraints: 'span 3') //title

        //tables
        def data = [[text: "ABC", combo: "abc"], [text: "DEF", combo: "def"]]
        def items = ['abc', 'def', 'ghi', 'jkl']
        def tableModelListener = { e -> println "${e.firstRow} ${e.column} ${e.type}" } as TableModelListener
        scrollPane(constraints: 'span 3' ) {
            table(id: 'serviceTable') {
                current.setFillsViewportHeight(false)
                tableModel(list: data) {
                    current.addTableModelListener(tableModelListener)
                    propertyColumn(header: 'Text', propertyName: 'text')
                    propertyColumn(header: 'Combo', propertyName: 'combo')
                }
            }
        }
        scrollPane(constraints: 'span 3' ) {
            table(id: 'groupsTable') {
                tableModel(list: data) {
                    current.addTableModelListener(tableModelListener)
                    propertyColumn(header: 'Text2', propertyName: 'text')
                    propertyColumn(header: 'Combo2', propertyName: 'combo')
                }
            }
        }
    }
}

И вот результат: Изображение http://img517.imageshack.us/img517/6508/15181501ym9.jpg

Я хочу сделать высоту таблицы в соответствии с количеством строк, и, если возможно, я бы хотел, чтобы таблица также занимала всю ширину. Я думаю, что моя проблема связана с родительскими панелями, но я не могу найти причину.

Ответы [ 2 ]

4 голосов
/ 23 февраля 2009

Да, это известная проблема с JTables. По умолчанию отображается 20 строк независимо от фактического содержания.

Если вы хотите изменить это, вы должны использовать код следующим образом:

static public void setTableHeight(JTable table, int rows)
{
    int width = table.getPreferredSize().width; 
    int height = rows * table.getRowHeight(); 
    table.setPreferredScrollableViewportSize(new Dimension(width, height));
}

Тогда просто позвоните setTableHeight(5);, если вы хотите, чтобы по умолчанию отображались 5 строк.

Примечание: это Java, вам, возможно, придется немного адаптировать его к Groovy.

Это то, что я описал в своем блоге в прошлом месяце (позиция № 7).

1 голос
/ 25 февраля 2009

@ jfpoilpret правильно, так как необходимо управлять размером предпочитаемого ScrollableViewpoet. Отличный способ - привязать его к предпочтительному размеру стола. Так что, если бы он был добавлен во внешний элемент scrollPane, он автоматически отслеживал бы размер:

[serviceTable, groupsTable].each { table ->
    bind(source:table, sourceProperty:'preferredSize', 
         target:table, targetProperty:'preferredScrollableViewportSize',
         converter: { ps -> 
             [ps.width + 100, 
              (table.rowCount > 20 ? 20: table.rowCount) * table.rowHeight]
         })
}

Мы также можем делать аккуратные вещи с привязкой, например, добавляя конвертер, который ограничит высоту до 20 строк (или чем угодно, чем вы хотите, чтобы он был ограничен), поэтому мы все равно получим полосы прокрутки, когда таблица становится слишком длинной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...