如何在JFrame中访问多个JPanel?

时间:2008-11-26 10:08:01

标签: java design-patterns swing controller jpanel

我有一个JFrame,其中包含一个带有JPanel的“显示”JTextField和一个带有按钮的“控件”JPanel,这些按钮应该可以访问显示内容{{} 1}}。我认为我的问题与如何使用观察者模式有关,原则上我理解。您需要放置侦听器并更新消息,但我不知道在哪里放置这些,如何从一个面板访问另一个面板,并且可能在必要时引入“datamodel”类。例如,我想从控制面板访问JPanel的内容,我使用匿名动作侦听器,如下所示:

JTextField

4 个答案:

答案 0 :(得分:1)

如果您在一个图层中创建模型并在上面添加一个或两个图层来创建组件和布局,它确实使代码更清晰。当然不要扩展JFrameJPanel的喜欢。

不要觉得需要使模型层中的合成层次与显示完全匹配。然后,只需从Document获取文本并执行相关操作即可。

好的,不是那么简单。摇摆模型有点乱。特别是ButtonModel是脑损伤的,代码的控制器区域可能不完全是纯粹的。

答案 1 :(得分:1)

您需要减少这些对象之间的耦合。

你可以拥有一个拥有所有文本字段和按钮的主对象(面板无关紧要)

然后在该主对象中的一个separete actionlistener(我称之为mediator看到mediator模式)

该动作侦听器在中介上执行一个方法,后者又从文本字段中获取值并创建一个传输对象。

通过这种方式,您可以减少面板,文本字段等之间的耦合,并将控件放在一个位置(调解器),即您不要让他们彼此了解。

您可以查看此问题中的代码: https://stackoverflow.com/questions/324554/#324559

它在运行代码中显示了这些概念。

顺便说一下,观察者模式已经在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.
    }
}

可以检索完整且正在运行的代码here:

在可能的情况下,重视组合而不是继承。

答案 2 :(得分:0)

我们有所谓的构建器,它将构建子组件中的父组件。在此构建器中,您将可以访问需要监听的所有子组件,因此可以在那里实现任何逻辑。

最后,构建器将返回具有完整逻辑的父面板。

一旦你获得了父级面板,那么找到子组件并让他们做任何事情真的很麻烦。

答案 3 :(得分:0)

感谢。我添加了一个数据模型层,它以某种方式处理面板之间的通信。

我还发现文本字段上的监听器上的这个链接很有用:

link text