Один JFrame и Два JPanels - PullRequest
       5

Один JFrame и Два JPanels

2 голосов
/ 22 февраля 2012

Я новичок в Java, и у меня проблема с панелями.У меня есть одна JFrame и две JPanels в моей программе.

  • Когда я нажимаю button1, в кадре будет отображаться panel1.
  • Когда я нажимаю button2, в кадре отображается panel2 и panel1 исчезает / скрывается.

Проблема в том, что panel1 не может показывать только panel2.Как показать две панели таким образом?

Это мой код:

public class test{

public static void main(String args[]){

     JButton b1 = new JButton("show p1");
     JButton b2 = new JButton("show p2");
     JLabel l1 = new JLabel("This is p1");
     JLabel l2 = new JLabel("This is p2");

     final JPanel p1 = new JPanel(new FlowLayout());
     p1.add(l1);
     final JPanel p2 = new JPanel(new FlowLayout());
     p2.add(l2);
     JPanel buttonPNL = new JPanel(new FlowLayout());
     buttonPNL.add(b1);
     buttonPNL.add(b2);

     b1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
                p1.setVisible(true);
                p2.setVisible(false);   
        }
     });

     b2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                    p1.setVisible(false);
                    p2.setVisible(true);   
            }
      });

     JFrame frm = new JFrame();
     frm.setLayout(new BorderLayout());
     frm.add(p1,BorderLayout.CENTER);
     frm.add(p2,BorderLayout.CENTER);
     frm.add(buttonPNL,BorderLayout.SOUTH);
     frm.setVisible(true);
     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frm.setSize(300,300);
 }
}

Ответы [ 5 ]

6 голосов
/ 22 февраля 2012

BorderLayout может обрабатывать только один компонент на ограничение, то есть в тот момент, когда вы добавляете p2 в CENTER, p1 забывается.Так что либо делайте удаление / добавление в ваших actionListeners, либо используйте другой LayoutManager, например fi CardLayout .

3 голосов
/ 22 февраля 2012

Для достижения таких целей вам нужно использовать CardLayout .

Более того, после удаления старой JPanel из JFrame для добавления новой JPanel всегда выполняйте revalidate () и repaint () в JFrame, чтобы реализовать изменения.Помните, что только один компонент может быть добавлен в любой момент времени в любом месте.Попробуйте этот код с модификациями:

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

public class PanelTest
{
    public PanelTest()
    {
        JButton b1 = new JButton("show p1");
        JButton b2 = new JButton("show p2");
        JLabel l1 = new JLabel("This is p1");
        JLabel l2 = new JLabel("This is p2");

        final JPanel p1 = new JPanel(new FlowLayout());
        p1.add(l1);
        final JPanel p2 = new JPanel(new FlowLayout());
        p2.add(l2);
        JPanel buttonPNL = new JPanel(new FlowLayout());
        buttonPNL.add(b1);
        buttonPNL.add(b2);

        final JFrame frm = new JFrame(); // shifted this line here.

        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                    // Added by me , these three lines
                    if (p2.isShowing())
                    {
                        frm.remove(p2);
                        frm.add(p1, BorderLayout.CENTER);                   
                        frm.revalidate(); // for JDK 1.7+
                        //frm.getRootPane().revalidate(); // for JDK 1.6 or lower
                        frm.repaint();
                    }
            }
        });

        b2.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                        if (p1.isShowing())
                        {
                            frm.remove(p1);
                            frm.add(p2, BorderLayout.CENTER);                   
                            // Added by me , these three lines
                            frm.revalidate(); // for JDK 1.7+
                            //frm.getRootPane().revalidate(); // for JDK 1.6 or lower
                            frm.repaint();
                        }
                }
        });


        frm.setLayout(new BorderLayout());
        frm.add(p1,BorderLayout.CENTER);
        frm.add(buttonPNL,BorderLayout.SOUTH);
        frm.setVisible(true);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setSize(300,300);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new PanelTest();
            }
        });
    }
}
2 голосов
/ 22 февраля 2012

Я бы использовал панель с вкладками для этой функции. Подробнее см. Как использовать панели с вкладками .

TabbedPaneDemo

2 голосов
/ 22 февраля 2012

Я думаю, проблема в том, что в CENTER может быть только один JComponent.Так что оберните две панели в панель и получите только в ЦЕНТРЕ:

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

public class JFrameProblem {

    public static void main(String[] args){

        JButton b1 = new JButton("show p1"); JButton b2 = new JButton("show p2");

        JLabel l1 = new JLabel("This is p1");
        JLabel l2 = new JLabel("This is p2");

        final JPanel p1 = new JPanel(new FlowLayout());
        p1.add(l1);
        final JPanel p2 = new JPanel(new FlowLayout());
        p2.add(l2);
        p2.setVisible(false);

        JPanel panelPNL = new JPanel(new FlowLayout());
        panelPNL.add(p1);
        panelPNL.add(p2);

        JPanel buttonPNL = new JPanel(new FlowLayout());
        buttonPNL.add(b1);
        buttonPNL.add(b2);

        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                p1.setVisible(true);
                p2.setVisible(false);
            }
        });

        b2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                p1.setVisible(false);
                p2.setVisible(true);
            }
        });

        JFrame frm = new JFrame();
        frm.setLayout(new BorderLayout());
        frm.add(panelPNL,BorderLayout.CENTER);
        frm.add(buttonPNL, BorderLayout.SOUTH);
        frm.setVisible(true);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setSize(300,300);
        frm.pack();
        frm.setVisible(true);
    }

}
1 голос
/ 22 февраля 2012

Вы можете сделать это с BorderLayout, вам просто нужно помнить, чтобы заново добавить панель, которую вы хотите отобразить.На самом деле вы уже обошли проблему переоценки, потому что используете setVisible ().

Это в основном то, что сказал Клеопатра - вот код:

JButton b1 = new JButton("show p1");
JButton b2 = new JButton("show p2");
JLabel l1 = new JLabel("This is p1");
JLabel l2 = new JLabel("This is p2");

final JPanel p1 = new JPanel(new FlowLayout());
p1.add(l1);
final JPanel p2 = new JPanel(new FlowLayout());
p2.add(l2);
JPanel buttonPNL = new JPanel(new FlowLayout());
buttonPNL.add(b1);
buttonPNL.add(b2);

final JFrame frm = new JFrame();
b1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        p1.setVisible(true);
        p2.setVisible(false);
        frm.add(p1, BorderLayout.CENTER);
    }
});

b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        p1.setVisible(false);
        p2.setVisible(true);
        frm.add(p2, BorderLayout.CENTER);
    }
});

frm.setLayout(new BorderLayout());
frm.add(p1, BorderLayout.CENTER);
p2.setVisible(false); // initial state
frm.add(buttonPNL, BorderLayout.SOUTH);
frm.setVisible(true);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(300, 300);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...