2011-02-09 5 views

ответ

2

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

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

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

1

Просто добавить текст в модели, как вы бы 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); 

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

1

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

  • подкласс 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 цента конечно :):

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