如何访问里面的JFrame多个JPanels?
-
11-07-2019 - |
题
我有一个包含与JFrame
并与应该访问显示JPanel
的内容按钮的“对照” JTextField
“显示” JPanel
一个JPanel
。我想我的问题是如何使用的观察者模式,原则上我理解相关。您需要将听众和更新的消息,但我没有一个线索在哪里放置这些,如何从一个面板访问对方,也许如果有必要引入“数据模型”类。例如,我想从控制面板访问JTextField
的内容,并予使用匿名动作侦听器,如下所示:
JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
openButtonPressed();
}
});
解决方案
您需要减少这些对象之间的耦合。
可以有一个主对象,它拥有所有文本框和按钮(面板是不相关的)
然后该主对象(I称之为介看到介体图案)内的separete的ActionListener
这动作侦听器执行对介这反过来从文本框采用的值和或许创建一个传输对象的方法。
这样,您减少面板,文本框等之间的耦合,并让在一个地方(调解员),这是控制,你不要让他们互相认识。
您可以看看在这个问题的代码: https://stackoverflow.com/questions/324554/#324559
它示出了在运行的代码这些概念。
BTW观察者模式中的JTextField,一个JButton,ActionListener的等,都已经实现,您只需要添加挂钩。
我希望这有助于。
修改强>加入两个答案为一体。
这是代码。
class App { // this is the mediator
// GUI components.
private JFrame frame;
private JTextField name;
private JTextField count;
private JTextField date;
// Result is displayed here.
private JTextArea textArea;
// Fired by this button.
private JButton go;
private ActionListener actionListener;
public App(){
actionListener = new ActionListener(){
public void actionPerformed( ActionEvent e ){
okButtonPressed();
}
};
}
private void okButtonPressed(){
// template is an object irrelevant to this code.
template.setData( getData() );
textArea.setText( template.getTransformedData() );
}
public void initialize(){
frame = new JFrame("Code challenge v0.1");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
name = new JTextField();
count = new JTextField();
date = new JTextField();
textArea = new JTextArea();
go = new JButton("Go");
go.addActionListener( actionListener ); // prepare the button.
layoutComponents(); // a lot of panels are created here. Irrelevant.
}
}
完整和运行的代码在这里可以检索:
可能的情况下有利于组合物过度继承这一点很重要。
其他提示
它确实使代码清洁器,如果你在一个层中创建的模型和添加一个以上或两个层来创建的部件和布局。当然不延伸JFrame
和JPanel
的喜欢。
不要感到有必要使在模型层的组合物的层次结构完全匹配的显示。然后,它只是一个以从Document
文本和执行相关操作问题。
好,perhpas并不那么简单。秋千车型都有点乱。特别是ButtonModel的大脑损伤,和代码的控制器区域可能不完全纯的。
我们有所谓的建设者,这将构建父面板出孩子。在这个生成器,你将有机会获得你要听,因此可以可以实现任何逻辑那里所有子组件。
最后,构建器将随后用完全逻辑返回父面板。
一旦你的父面板这真是一个烂摊子让孩子部件并将它们做任何事情。