【发布时间】:2009-12-02 17:10:18
【问题描述】:
我在 JTabbedPane 中的(多个)JScrollPane 中有一个 JTextArea。
我需要访问 JTextArea。如果我没有 JScrollPane,我可以这样做:
JTextArea c = (JTextArea)jTabbedPane1.getComponentAt(i);
在 JScrollPane 中如何获取它?
干杯, 加兹勒。
【问题讨论】:
我在 JTabbedPane 中的(多个)JScrollPane 中有一个 JTextArea。
我需要访问 JTextArea。如果我没有 JScrollPane,我可以这样做:
JTextArea c = (JTextArea)jTabbedPane1.getComponentAt(i);
在 JScrollPane 中如何获取它?
干杯, 加兹勒。
【问题讨论】:
听起来你会在那儿陷入一堆乱七八糟的参考资料(至少我过去就是这样)。
我建议您有一个中间对象来为您负责这些依赖项,并将“业务”方法移到那里。
因此,您可以使用具有引用的对象,而不是添加组件并丢失引用(或者最糟糕的是,在整个地方复制引用):
class AppMediator {
private JTextArea area;
private JTabbetPane pane;
// etc.
public void doSomethingWithText() {
this.area.getText(); // etc
}
}
参见Mediator 设计模式。重点是将所有“视图”对象从它们所在的位置(通常作为子类中的引用)移动到一个公共的中间对象。
【讨论】:
这条线看起来很复杂,但我认为这样就可以了。
JTextArea c = (JTextArea) (((JViewportView) (((JScrollPane) jTabbedPane1.getComponentAt(i)).getViewport()))).getView();
但我认为将TextArea 存储在ArrayList 中会更有趣。
所以你可以这样做:
List<JTextArea> listAreas = new ArrayList<JTextArea>();
...
JTextArea c = listAreas.get(i);
新建一个是这样的:
JTextArea c = new JTextArea();
jTabbedPane1.addTab("Title", new JScrollPane(c));
listAreas.add(c);
希望这会有所帮助。
【讨论】:
我更喜欢 AppMediator 方法,但你也可以这样做
scrollPane.getViewport().getView()
【讨论】: