Как установить размер диалога в соответствии с размером JTable?

У меня есть JDialog с JTable. Я хочу диалоговое окно с размером, равным размеру таблицы (если оно не превышает максимальный размер). И в таблице я хочу, чтобы любая ячейка имела размер 80 * 25 пикселей. Вот код, который у меня есть сейчас:

JTable table = new JTable(res, varnames);
table.setRowHeight(25);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i <= nvars; i++) {
    table.getColumnModel().getColumn(i).setMinWidth(80);
    table.getColumnModel().getColumn(i).setMaxWidth(80);
    table.getColumnModel().getColumn(i).setPreferredWidth(80);
}
JScrollPane tableSP = new JScrollPane(table);
out.getContentPane().add(tableSP);
table.setEnabled(false);
out.pack();
out.setVisible(true);

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

Изменить: обнаружена проблема, из-за которой появляется дополнительное пространство. JScrollPane почему-то занимает гораздо больше места, чем сама таблица. Но мне нужна ScrollPane для заголовка. Есть ли способ сделать так, чтобы он занимал меньше места?


person CypherAJ    schedule 28.09.2013    source источник


Ответы (2)


Дополнительная область, которую вы видите, - это scrollPane: она учитывает предпочтительныйScrollableViewportSize своего представления (если он реализует Scrollable). Обычный JTable возвращает это свойство как (довольно произвольный) жестко заданный размер. Таким образом, решение состоит в том, чтобы создать подкласс и реализовать метод, чтобы вернуть что-то разумное, т.е. с точки зрения visibleRows:

JTable table = new JTable(10, 5) {
    // make this a property in a custom table
    int visibleRows = 10;
    /**
     * Overridden to exactly fit a given number of rows/columns
     */
    @Override
    public Dimension getPreferredScrollableViewportSize() {
        int height = visibleRows * getRowHeight();
        int width = getPreferredSize().width;
        return new Dimension(width, height);
    }

};

Или используйте JXTable (часть проекта SwingX), который уже предоставляет свойства visibleRows/-Columns.

person kleopatra    schedule 29.09.2013

Я хочу диалоговое окно с размером, равным размеру таблицы

JTable table = new JTable(...);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
dialog.add( scrollPane );
dialog.pack();
dialog.setVisible( true );
person camickr    schedule 30.09.2013
comment
обычная осторожность (как вы знаете :-) жесткое кодирование prefScrollableSize лишь незначительно меньше зла, чем обычный setXXSize - person kleopatra; 30.09.2013