Как отображать центрированный текст или что-то подобное внутри JTable, если после запроса нет результатов? Спасибо всем.Центрированный JLabel внутри JTable
ответ
Я бы не показать этикетку внутри JTable, но вместо JTable.
Попробуйте удалить элемент таблицы из его контейнера и добавьте Jlabel с сообщением.
Когда пользователь запускает другой запрос, с положительными результатами, сделать обратный путь (удалить метку, добавить таблицу)
Просто добавить текст в модели, как вы бы Noramlly делать, а затем создать пользовательский визуализатор. Что-то вроде:
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
table.getColumnModel().getColumn(???).setCellRenderer(centerRenderer);
Или, если вы хотите, чтобы все столбцы, содержащие строковые данные, чтобы быть в центре, то вы можете использовать
table.getDefaultRenderer(class.String);
, а затем сбросить выравнивание для этого визуализатора.
Редактировать: Я неправильно понял вопрос.
Если все, что вы хотите сделать, это показать сообщение в таблице, вы можете изменить TableModel таблицы, чтобы отобразить только одну таблицу столбцов с одной строкой с сообщением об ошибке. В этом столбце по-прежнему необходимо использовать собственный рендерер.
Для сброса модели просто сделать:
DefaultTableModel model = new DefaultTableModel(...);
table.setModel(model);
Конечно, если запрос успешен вы также должны сбросить модель с новыми данными, а также.
Другая альтернатива: действительно покрасьте некоторые - соответствующим образом расположенные - текст в таблице вместо строк, если строк нет. Для достижения этой
- подкласс J/X/Table и переопределить paintComponent
убедитесь, что таблица расширяется до размеров окна просмотра (то есть tracksViewportHeight правда, это по умолчанию для JXTable, должны быть заданы явно для JTable)
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (getRowCount() > 0) return; Component comp = getNoDataRenderer(); CellRendererPane rendererPane = getRendererPane(); Dimension size = getSize(); Dimension prefSize = comp.getPreferredSize(); Rectangle rect = new Rectangle((size.width - prefSize.width)/2, size.height/4, prefSize.width, prefSize.height); rendererPane.paintComponent(g, comp, this, rect); } private Component getNoDataRenderer() { if (noDataRenderer == null) { noDataRenderer = createNoDataRenderer(); } String localizedNoData = UIManager.getString("noData"); Component comp = noDataRenderer.getTableCellRendererComponent(this, localizedNoData != null ? localizedNoData : "No Data Available", false, false, -1, -1); Font bigger = getFont().deriveFont(Font.BOLD | Font.ITALIC, getFont().getSize2D() * 2); comp.setFont(bigger); return comp; } private DefaultTableCellRenderer createNoDataRenderer() { DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setForeground(Color.GRAY); return renderer; } private CellRendererPane getRendererPane() { for (int i = 0; i < getComponentCount(); i++) { if (getComponent(i) instanceof CellRendererPane) { return (CellRendererPane) getComponent(i); } } return null; }
Преимущества перед другими предложениями (возможно, это мои 2 цента конечно :):
- компоненты коммутатора (ярлык против таблицы): вид прерывистых визуальных эффектов, которые могут смутить пользователей. Пустая таблица по-прежнему является таблицей.
- специальная пустая модель: решение проблемы с представлением в области данных ... субоптимально. Плюс особое внимание следует обратить на то, чтобы не потерять состояние колонки реальной модели