引用外部父JPanel

时间:2014-11-20 07:38:22

标签: java swing jpanel

我目前正在尝试将作为额外信用的作业的GUI编码为学习机会。我需要一个按钮菜单,每个按钮有效地更改主面板以输入或显示数据。现在,我有一个名为buttonContainer的类,它包含主菜单,mainPanel,它包含整个GUI的主面板。基本上我需要一种方法让buttonContainer添加和删除其父级mainPanel中的元素 - 其中两个元素保留为单独的文件。

我的buttonContainer课程如下:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class buttonPanel extends JPanel implements ActionListener
{
    private JButton load, save, list, find, input, sort, exit;
    private JPanel BtnContainer, parent;
    private newContactPanel newContact;


    public buttonPanel()
    {
        load = new JButton("Load Contacts");
        save = new JButton("Save Contacts");
        list = new JButton("List Contacts");
        find = new JButton("Find Contact");
        sort = new JButton("Sort Contacts");
        input = new JButton("New Contact");
        exit = new JButton("Exit Program");

        newContact = new newContactPanel();
        parent = this.getParent();
        BtnContainer = new JPanel();
        BtnContainer.setLayout(new GridLayout(0,1));
        BtnContainer.add(load);
        BtnContainer.add(save);
        BtnContainer.add(list);
        BtnContainer.add(sort);
        BtnContainer.add(find);
        BtnContainer.add(input);
        BtnContainer.add(exit);
        add(BtnContainer);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == input)
        {
            //Change panel command here
        }

    }
}

mainPanel代码如下所示:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class mainPanel extends JPanel //implements ActionListener
{
    private buttonPanel MainMenu;
    private newContactPanel newContact;
    private JPanel wrapper;

    public mainPanel()
    {
        wrapper = new JPanel();
        this.setLayout(new BorderLayout());
        wrapper.setLayout(new BorderLayout());
        MainMenu = new buttonPanel();
        newContact = new newContactPanel();

        wrapper.add(MainMenu, BorderLayout.WEST);
        add(wrapper, BorderLayout.WEST);
    }
}

contactPanel是一个不同的面板,我希望buttonPanel触发mainPanel来展示。是否有任何简单的方法可以像这样重新定义父类,同时保持两个类分开?

我之前已经知道这个问题的变体,但是,我在这里看到的任何内容似乎都没有完成我想要的。其中有几个并不完全符合我的要求 - 大多数都是来自同一个文件。有几个使用了getParent() - 但如果我尝试使用它,它只会抓取Container,而不是JPanel


编辑:感谢回答的人。提出了几个好主意 - 这让我意识到我忘了将动作监听器添加到按钮中。这个问题已经完全解决了!

2 个答案:

答案 0 :(得分:0)

你可以使包装器公共静态

public static JPanel wrapper;

然后从buttonPanel你可以使用这个代码

mainPanel.wrapper.remove(<whatever component>);
mainPanel.wrapper.add(<whatever component>);
mainPanel.wrapper.validate();
mainPanel.wrapper.repaint();

我认为这会有用

答案 1 :(得分:0)

  

基本上我需要一种方法让buttonContainer从其父级mainPanel添加和删除元素,其中剩下两个元素   单独的文件。

您可以在ButtonContainer课程中使用SwingUtilities.getAncestorOfClass(class, comp),因为您知道该课程属于该课程的孩子。例如:

class ButtonContainer extends JPanel implements ActionListener {
    ...
    @Override
    public void actionPerformed(ActionEvent e) {
        MainPanel mainPanel = (MainPanel)SwingUtilities.getAncestorOfClass(MainPanel.class, ButtonContainer.this);
        if (mainPanel != null) {
            // Change panel command here
        }
    }
}

题外话

请阅读Java Code Conventions并坚持下去。类&#39;名字以大写字母开头;变量和方法名称以小写字母开头。