проблема во вложенной Jpanel над Jframe - PullRequest
5 голосов
/ 09 сентября 2011

У меня есть JFrame и Jpanel над тем, в котором размещены various buttons .so по нажатию кнопки Я назвал new class, что also having containers placed in a Jpanel .soЯ хочу show, что new class panel над main Jframe panel. Как я могу это сделать?

И если мы используем в нем макет карты, то как я могу использовать это, как при нажатии кнопки, которую я назвалобъект нового класса.as

Card layout consider each component in a container as card and i want whole Jpanel as a card so is it possible to do that???

Можем ли мы сделать в нем Jpanels?

Пожалуйста, предложите мне правильный способ сделать это?

вот SSCCE:

// this is the  main class on which i want to use panel of other class
public class mymain 
{
    JFrame jframe =  new JFrame();
    JPanel panel = new JPanel();
    BorderLayout borderlayout = new BorderLayout();

public mymain()
{
    jframe.setLayout(borderlayout);
    JMenuBar menubar = new JMenuBar();
    jframe.setJMenuBar(menubar);

    JButton home_button = new JButton("HOME");
    menubar.add(home_button);
    jframe.getContentPane().add(panel,BorderLayout.CENTER);             
    panel.setLayout(new GridBagLayout());

    //here used containers over that frame              
             and call it from main()

}

here is another class to manage category is 

public class manageCategory 
{
JPanel panel = new JPanel();
GridBagLayout gridbglayout = new GridBagLayout();
GridBagConstraints gridbgconstraint = new GridBagConstraints();
public manageCategory()
{
            panel.setLayout(new BorderLayout());
    // i have again here used containers placed with grid bag layout
}

}

Так что теперь я хочу, чтобы, поскольку я click on home button использовал в mymain классе, то panel, который являетсяиспользуется в manageCategory() должно быть displayed на той же панели. и когда я снова нажимаю на кнопку home, появляется mymain panel. Как я могу это сделать ???

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011

Я бы посоветовал вам использовать CardLayout для этой задачи.


Обновлен пример с JPanel и "классами":

static class MainPanel extends JPanel {
    public MainPanel(final Container frame) {
        add(new JButton(new AbstractAction("Click to view next") {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.add(new NextPanel(), "NextPanel");
                ((CardLayout) frame.getLayout()).show(frame, "NextPanel");
            }
        }));
    }
}

static class NextPanel extends JPanel {
    public NextPanel() {
        add(new JLabel("Next page in the card layout"));
    }
}

public static void main(String[] args) throws Exception {
    JFrame frame = new JFrame("Test");
    frame.setLayout(new CardLayout());
    frame.add(new MainPanel(frame.getContentPane()), "MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}
1 голос
/ 09 сентября 2011

CardLayout - один из возможных способов, но есть и другие варианты, действительные или обязательные для большинства завершенных графических интерфейсов

1) BorderLayout, потому что только один JComponent может занимать область принятия решения

someContainer.add(myPanel, BorderLayout.CENTER) 
revalidate();
repaint();

2) GridBagLayout

прежде чем что-либо, что вы должны объявить GridBagConstraints из myOldComponent, заложенного в GridBagLayout

myContainer.setVisible(myOldComponent);
//or
myContainer.remove(myOldComponent);

myContainer.add(myNewComponent, gbc);
revalidate();
repaint();
1 голос
/ 09 сентября 2011

Вы можете

 JFrame myFrame = new JFrame();
 JPanel panel1 = new JPanel();
 Panel1.setVisible(true);
 myFrame.add(panel1);


 JPanel panel2 = new JPanel();
 Panel2.setVisible(false);
 myFrame.add(panel2);

 //Here you setup your panels and your actionlisteners etc and when
 //you wish for your second panel to show up just run the code below.

 panel1.setVisible(false);
 panel2.setVisible(true);

Очевидно, что сначала вы должны добавить обе панели в свой Jframe.Сначала будет видна Panel1, так как она показана по умолчанию.Panel2 вначале должна быть невидимой.

...