2015-05-02 3 views
1

В приведенном ниже коде показаны 2 JTables.Повторное использование JTableHeader

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

Однако выполнение кода приводит к тому, что заголовок отображается во второй таблице, но не в таблице, изначально.

Меня интересуют только обходные пути, но - ради обучения и понимания - больше интересует, почему заголовок не отображается в первой таблице.

Вот код:

public class HeaderTest1 { 

public void doTheTest() { 
    JFrame testFrame = new JFrame("Header Test"); 
    JPanel pane = new JPanel(); 

    Container theContentPane = testFrame.getContentPane(); 

    BoxLayout box = new BoxLayout(pane, BoxLayout.Y_AXIS); 
    pane.setLayout(box); 
    theContentPane.add(pane); 

    String theData[][] 
      = { 
       {"One", "two", "3"}, 
       {"four", "5", "six"}, 
       {"7", "8", "9.0"}, 
       {"£10.00", "11", "twelve"} 
      }; 

    String columnNames[] = {"Column 1", "Column 2", "Column 3"}; 

    JTable firstTable = new JTable(theData, columnNames); 

    JScrollPane thisScrollPane = new JScrollPane(firstTable); 
    JTableHeader thisTableHeader = firstTable.getTableHeader(); 

    pane.add(thisScrollPane); 

    buildTheSecondTable(thisTableHeader, firstTable, columnNames, pane); 

    testFrame.pack(); 
    testFrame.setVisible(true); 
} 

private void buildTheSecondTable(JTableHeader headerFromTheFirstTable, 
     JTable firstTable, String[] columnNames, JPanel pane) { 

    JTable secondTable = new JTable(); 
    int columnCount = columnNames.length; 

    JScrollPane thisScrollPane = new JScrollPane(secondTable); 
    secondTable.setTableHeader(headerFromTheFirstTable); 

    Object[][] emptyData = new Object[1][columnCount]; 
    for (int n = 0; n < columnCount; n++) { 
     emptyData[0][n] = ""; 
    } 
    DefaultTableModel thisTableModel = new DefaultTableModel(); 
    thisTableModel.setDataVector(emptyData, columnNames); 
    secondTable.setModel(thisTableModel); 
    secondTable.setLayout(firstTable.getLayout()); 
    secondTable.setCellEditor(firstTable.getCellEditor()); 
    pane.add(thisScrollPane); 
} 

public static void main(String[] args) throws SQLException, ParseException { 
    HeaderTest thisTest = new HeaderTest(); 
    thisTest.doTheTest(); 
} 

Любые советы будут оценены

+1

* «Как они будут иметь одинаковые заголовки, которые я хотел, ради эффективности ...» * Значит ли термин «преждевременная оптимизация» что-то для вас? Это классический случай. –

+1

О, BTW - компонент Java может появляться только в одном месте. –

+0

@ Andrew Thompson. Возьмите свою «повторную оптимизацию». Однако я хотел узнать, почему это произошло, поэтому отправляя то, что было тривиальной проблемой – user3001792

ответ

3

Компонент Swing, может иметь только одного родителя, так что вы не можете разделить компонент заголовка таблицы.

Однако вы можете разделить массив имен столбцов:

JTable firstTable = new JTable(theData, columnNames); 

В вашем методе buildTheSecondTable у вас есть доступ к массиву имен столбцов так просто использовать:

//DefaultTableModel thisTableModel = new DefaultTableModel(); 
DefaultTableModel thisTableModel = new DefaultTableModel(columnNames); 

Затем вы можете добавить данные к модели и модели к таблице.

Затем измените порядок кода, чтобы создать JScrollPane после добавления модели в таблицу.

Также избавитесь от кода table.setLayout(). Вы никогда не использовали бы менеджера компоновки на столе. Вы не добавляете компоненты в таблицу. Таблица отображает данные без использования реальных компонентов.

+0

camickr, получил его. Одинокий родитель. Большое спасибо за это объяснение и решение. Я ответил на этот вопрос. – user3001792

Смежные вопросы