2015-05-11 4 views
1

Таким образом, я динамически добавляю JTextArea s к JTabbedPane по щелчку ячейки JTable. Мне было интересно, как динамически установить текст JTextArea. Я искал попытку использовать getSelectedIndex(), вложенный в getComponentAt(), но это возвращает Component, а не JTextArea, поэтому я не смогу setText() таким образом. Я интересно, если вместо этого мне нужно построить Array или ArrayList из new JTextArea с и добавить к Array или ArrayList каждый раз при выборе ячейки, а затем из getSelectedIndex() и установить соответствующий JTextArea сек текст. Необходимый код ниже:Добавление текста в несколько JTextAreas на разных вкладках JTabbedPane динамически?

table.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
     if (e.getClickCount() == 2) { 
      int row = table.getSelectedRow(); 
      viewerPane.addTab((String) table.getValueAt(row, 0), null , new JPanel().add(new JTextArea()), (String) table.getValueAt(row, 0)); 
      viewerPane.setSelectedIndex(viewerPane.getComponentCount()-1); 
     } 
    } 
}); 

ответ

1

Вы можете использовать Map ключом с индексом вкладок и оценивается с JTextArea по этому показателю:

Map<Integer, JTextArea> indexToTextArea = new HashMap<>();//Instance variable 
.... 
//in the MouseListener: 
JTextArea textArea = new JTextArea(); 
viewerPane.addTab((String) table.getValueAt(row, 0), null , new JPanel().add(textArea), (String) table.getValueAt(row, 0)); 
viewerPane.setSelectedIndex(viewerPane.getComponentCount()-1); 
indexToTextArea.put(viewerPane.getComponentCount()-1, textArea); 

Если вы хотите, чтобы получить JTextArea от выбранного в данный момент вкладка индекса, например, просто посмотреть в Map

JTextArea selectedTextArea = indexToTextArea.get(viewer.getSelectedIndex()); 
+0

Это сработало. Спасибо, но у меня теперь есть другая проблема. Мне не удалось увидеть весь текст, который отображался, потому что он был слишком большим. Я попытался изменить 'новый JPanel(). Add (textArea)' на новый JScrollPane(). Add (textArea) ', но это все еще не устраняет проблему. – RPBruiser

+0

Можете ли вы уточнить? Вы видите 'JScrollPanel'? Возможно, «LayoutManager» на вкладке не правильно определяет «Компонент» - нужно попробовать добавить JScrollPane в 'JPanel' и добавить' JPanel' в 'JTabbedPane' – copeg

+0

Я даже не см. 'JScrollPane', и я уже попытался добавить его в' JPanel'. – RPBruiser

2

Вы добавляете:

new JPanel().add(new JTextArea()) 

новый товар Tab.

Это значит, getComponentAt() вернет точно этот JPanel вы добавили.
Этот JPanel является тип Component и содержит ваш JTextArea.

Что вы могли бы сделать (так как это JPanel делает только содержат JTextArea):

//verbose code: 
Component cmp = tab.getComponentAt(0 /*index of tab*/); 
JPanel pnl = (JPanel)cmp; //cast to JPanel 
Component cmp2 = pnl.getComponent(0); //get first child component 
JTextArea textArea = (JTextArea)cmp2; //cast to JTextArea 

как Helper-метод:

public JTextArea getTextAreaFromTab(JTabbedPane p_tabbedPane, int p_tabIdx) 
{ 
    Component cmp = p_tabbedPane.getComponentAt(p_tabIdx /*index of tab*/); 
    JPanel pnl = (JPanel)cmp; //cast to JPanel 
    Component cmp2 = pnl.getComponent(0); //get first child component 
    JTextArea textArea = (JTextArea)cmp2; //cast to JTextArea 
    return textArea; 
} 

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

  • Нет связанных вопросов^_^