По центру JLabel внутри JTable - PullRequest
1 голос
/ 09 февраля 2011

Как я могу отобразить центрированный текст или что-то подобное внутри JTable, если после запроса нет результатов? Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Я бы не показывал Label внутри JTable, но вместо JTable.

Попробуйте удалить элемент таблицы из его контейнера и добавить Jlabelс сообщением.

Когда пользователь запускает другой запрос с положительными результатами, поступите противоположным образом (удалите метку, добавьте таблицу)

1 голос
/ 11 сентября 2011

Другая альтернатива: действительно нарисуйте некоторый - соответствующим образом расположенный - текст в таблице вместо строк, если строк нет. Для достижения этого

  • подкласс J / X / Таблица и переопределение paintComponent
  • убедитесь, что таблица расширена до размера области просмотра (т. Е. TrackViewportHeight имеет значение true, это значение по умолчанию для 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 цента, конечно:):

  • Переключение компонентов (метка против таблицы): вид прерывистых визуальных эффектов, которые могут запутать пользователей. Пустая таблица остается таблицей.
  • специальная пустая модель: решение проблемы представления в области данных ... неоптимально. Кроме того, необходимо соблюдать особую осторожность, чтобы не потерять состояние столбца реальной модели
1 голос
/ 09 февраля 2011

Просто добавьте текст в модель, как это обычно делается, а затем создайте пользовательский рендер.Что-то вроде:

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );

Или, если вы хотите, чтобы все столбцы, содержащие данные String, были центрированы, вы можете использовать

table.getDefaultRenderer(class.String);

и затем сбросить выравнивание для этого средства визуализации.

Редактировать: я неправильно понял вопрос.

Если все, что вы хотите сделать, это отобразить сообщение в таблице, то вы можете изменить TableModel таблицы, чтобы просто отображать таблицу из одного столбца с одной строкой с вашимсообщение об ошибке.В этом столбце по-прежнему нужно будет использовать настраиваемое средство визуализации.

Для сброса модели вы просто выполните:

DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );

Конечно, если запрос выполнен успешно, вам также придется сбросить модель с помощьюновые данные.

...