动态地向 JTabbedPane 的不同选项卡中的多个 JTextAreas 添加文本?

Adding text to multiple JTextAreas in different tabs of a JTabbedPane dynamically?

因此,我在单击 JTable 单元格时将 JTextArea 动态添加到 JTabbedPane。我想知道如何动态设置 JTextArea 的文本。我正在考虑尝试使用嵌套在 getComponentAt() 中的 getSelectedIndex(),但是这个 returns 是 Component 而不是 JTextArea,所以我将无法 setText()这样。我想知道我是否需要构建 new JTextAreaArrayArrayList 并在每次选择单元格时添加到 ArrayArrayList然后从 getSelectedIndex() 中设置相应的 JTextAreas 文本。必要的代码如下:

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);
        }
    }
});

您可以使用 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());

您正在添加:

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

作为新标签。

这意味着,getComponentAt() 将 return 完全 您添加的这个 JPanel
JPanelComponent 的类型,包含您的 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

作为辅助方法:

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;
}