Вопрос

Я пытаюсь сделать JTable который имеет доступные диапазоны столбцов.В частности, я хочу вложить JTable внутри другого JTable, и когда пользователь нажимает, чтобы просмотреть вложенную таблицу, она должна развернуться, чтобы опустить строки ниже и заполнить пустое пространство.Это похоже на то, что вы видите в MS Access, где вы можете вкладывать таблицы, а нажатие кнопки «Развернуть» в строке покажет вам соответствующие записи во вложенной таблице.

Если кто-то знает способ выполнить интервал столбца с помощью JTable, не могли бы вы указать мне правильное направление?Или, если вы знаете альтернативный способ сделать это, я открыт для предложений.Приложение создается с помощью Swing.Элементы таблицы, как высокого, так и низкого уровня, должны быть доступны для редактирования в любом решении.Использование вложенных JTableЭто не будет проблемой, и любое другое решение также должно будет это учитывать.

Это было полезно?

Решение

В качестве указателя в правильном направлении попробуйте Эта статья в SwingWiki, который довольно хорошо объясняет метод охвата столбцов TableUI.До этого я также пробовал некоторые альтернативы, такие как переопределение методов рисования TableCellRenderer, но без особого успеха.

Другие советы

Вам нужно написать собственный TableUI для главной таблицы.Также может быть полезно использовать собственную TableModel для сохранения дополнительных данных, например, при расширении строки.Но это необязательно.

Я пишу равный TableUI, который расширяет строку и показывает текстовый редактор.В TableUI вам необходимо динамически изменять высоту строки с помощью table.setRowHeight(height).Также необходимо скопировать некоторые данные из BaseTableUI, поскольку вы не можете получить доступ к личным материалам.

На основе кода от Code-Guru:

/*
 *  (swing1.1beta3)
 * 
 * |-----------------------------------------------------|
 * |   1st  |      2nd    |      3rd         |
 * |-----------------------------------------------------|
 * |    |    |    |    |        |        |
 */
//package jp.gr.java_conf.tame.swing.examples;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

import jp.gr.java_conf.tame.swing.table.*;

/**
 * @version 1.0 11/09/98
 */
public class MultiWidthHeaderExample extends JFrame {

  MultiWidthHeaderExample() {
    super( "Multi-Width Header Example" );

    DefaultTableModel dm = new DefaultTableModel();
    dm.setDataVector(new Object[][]{
      {"a","b","c","d","e","f"},
      {"A","B","C","D","E","F"}},
    new Object[]{"1 st","","","","",""});

    JTable table = new JTable( dm ) {
      protected JTableHeader createDefaultTableHeader() {
        return new GroupableTableHeader(columnModel);
      }
    };
    TableColumnModel cm = table.getColumnModel();
    ColumnGroup g_2nd = new ColumnGroup("2 nd");
    g_2nd.add(cm.getColumn(1));
    g_2nd.add(cm.getColumn(2));
    ColumnGroup g_3rd = new ColumnGroup("3 rd");
    g_3rd.add(cm.getColumn(3));
    g_3rd.add(cm.getColumn(4));
    g_3rd.add(cm.getColumn(5));
    GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
    header.addColumnGroup(g_2nd);
    header.addColumnGroup(g_3rd);
    JScrollPane scroll = new JScrollPane( table );
    getContentPane().add( scroll );
    setSize( 400, 100 );  
    header.revalidate(); 
  }

  public static void main(String[] args) {
    MultiWidthHeaderExample frame = new MultiWidthHeaderExample();
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent e ) {
        System.exit(0);
      }
    });
    frame.setVisible(true);
  }
}

Источник: http://www.codeguru.com/java/articles/125.shtml (недоступно с 2012 года, см. сейчас в веб-архив)

Другие ресурсы:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top