简体   繁体   English

从actionlistener调用swing JPanels

[英]Calling swing JPanels from actionlistener

im coding a project using various classes, but i got stuck when i press a button which call my main menu, here's my resumed code: 我使用各种类对项目进行编码,但是当我按下调用主菜单的按钮时,我陷入了困境,这是我的恢复代码:

My main class: 我的主班:

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        Dimension res = Toolkit.getDefaultToolkit().getScreenSize();

public void run(){

    Principal frame = new Principal("Program");

    frame.setSize(res.width,res.height);

    frame.setResizable(false);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setUndecorated(true);

    frame.setVisible(true); 
    }
});`

Now, my principal: 现在,我的校长:

 public class Principal extends JFrame implements ActionListener {


     private DetallesPrincipal DetallesPrincipal;

     private ClientesNuevo ClientesNuevo;

     private ClientesModificar ClientesModificar;

     Container p;

     private static final long serialVersionUID = 1L;

     final JMenuItem Clientes1,Clientes2,Clientes3;

     final JMenuBar MenuBarMain = new JMenuBar();

 public Principal (String titulo){

      super(titulo); 

          setLayout(new BorderLayout());

      final JMenuBar MenuBarMain = new JMenuBar();

        MenuBarMain.setBackground(new Color(177,178,182));

      final JMenu MenuMainClientes;

        MenuMainClientes = new JMenu("Clientes");



            DetallesPrincipal = new DetallesPrincipal();
            ClientesNuevo = new ClientesNuevo();

                   p = getContentPane();

                MenuBarMain.add(MenuMainClientes);

                Clientes1 = new JMenuItem("Nueva ficha");

                    MenuMainClientes.add(Clientes1);

                            Clientes1.addActionListener(this);

                p.add(MenuBarMain, BorderLayout.PAGE_START);

                p.add(DetallesPrincipal, BorderLayout.CENTER);

    }


     @Override
     public void actionPerformed(ActionEvent e) {

        if (e.getSource()==Clientes1){

            p.removeAll();

            p.repaint();

            p.add(ClientesNuevo, BorderLayout.CENTER);

            p.revalidate();

            p.repaint();
        }

My ClientesNuevo: 我的客户

public class ClientesNuevo extends JPanel implements ActionListener {

    private static final long serialVersionUID = 1L;

    DetallesPrincipal m;

    GridBagConstraints gc = new GridBagConstraints();

public ClientesNuevo() {


    Dimension size = getPreferredSize();
        size.width = 250;

        setPreferredSize(size);

        setBackground(new Color(111,114,123));

        TitledBorder Principal2 = BorderFactory.createTitledBorder("Te encuentras en clientes");

        Principal2.setTitleColor(new Color(100,100,100));

        Principal2.setTitleFont(new Font("Arial",0,24));

        Principal2.setTitlePosition(TitledBorder.BOTTOM);

        Principal2.setTitleJustification(TitledBorder.LEFT);

        setBorder(Principal2);


    JLabel Titulo1 = new JLabel("Nueva ficha cliente");

        Titulo1.setFont(new Font("Tahoma",0,36));

    JLabel Nombre = new JLabel("Nombre/Razón social ");

    JLabel Apellidos = new JLabel("Apellidos ");

    JLabel Cif = new JLabel("CIF/DNI ");

    JLabel Poblacion = new JLabel("Población ");

    JLabel Provincia = new JLabel("Provincia");

    JLabel Cpostal = new JLabel("Código postal");

    JLabel Telefono = new JLabel("Teléfono");

    JLabel Movil = new JLabel("Móvil");

    JLabel Notas = new JLabel("Notas");


    JTextField NombreText = new JTextField(25);

    JTextField ApellidosText = new JTextField(25);

    JTextField CifText = new JTextField(15);

    JTextField PoblacionText = new JTextField(15);

    JTextField ProvinciaText = new JTextField(20);

    JTextField CpostalText = new JTextField(15);

    JTextField TelefonoText = new JTextField(20);

    JTextField MovilText = new JTextField(20);

    JTextField NotasText = new JTextField(30);


    JButton Aceptar = new JButton("Aceptar");

    JButton Cancelar = new JButton("Cancelar");

        Aceptar.addActionListener(this);


    setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();


            gc.gridx = 0;

            gc.gridy = 0;

            gc.weighty = 1;

            add(Titulo1, gc);


            gc.anchor = GridBagConstraints.LINE_START;

            gc.gridx = 0;

            gc.gridy = 1;

            add(Nombre, gc);


            gc.gridx = 1;

            gc.gridy = 1;

            add(NombreText, gc);


            gc.gridx = 0;

            gc.gridy = 2;

            add(Apellidos, gc);

            gc.anchor = GridBagConstraints.LINE_START;

            gc.gridx = 1;

            gc.gridy = 2;

            add(ApellidosText, gc);


            gc.anchor = GridBagConstraints.LINE_START;

            gc.weightx = 1;

            gc.weighty = 1;

            gc.gridx = 0;

            gc.gridy = 3;

            add(Cif, gc);


            gc.anchor = GridBagConstraints.LINE_START;

            gc.gridx = 1;

            gc.gridy = 3;

            add(CifText, gc);

            gc.gridx = 0;

            gc.gridy = 4;

            add(Poblacion, gc);


            gc.gridx = 1;

            gc.gridy = 4;

            add(PoblacionText, gc);

            gc.gridx = 2;

            gc.gridy = 4;

            add(Provincia, gc);


           gc.gridx = 2;

           gc.gridy = 7;

            add(Aceptar, gc);


           gc.gridx = 3;

           gc.gridy = 7;

            add(Cancelar, gc);
}



 public void actionPerformed(ActionEvent e) {

               removeAll();

               repaint();

                m = new DetallesPrincipal();

            add(m,gc);

            revalidate();

            repaint();

    }


    }

Well, sorry for that walltext, but i am pretty lost, i just want call to my components of my DetallesPrincipal class, what's the better option to manage a program like this? 好吧,为那个墙文本感到抱歉,但是我很迷茫,我只想调用我的DetallesPrincipal类的组件,管理这样的程序的更好选择是什么?

Well besides the fact that you dont post your full source or an SSCCE I cannot fully test. 除了您没有发布完整的源代码或SSCCE之外,我无法完全测试。

Looking at your code you are using the removeAll() method to switch between multiple JPanel s on a single JFrame / container . 查看您的代码,您正在使用removeAll()方法在单个JFrame / 容器上的多个JPanel之间切换。

The mistake I see you are making though is in the logic, as you attempt to switch between JPanel s within another JPanel rather than within your actual JFrame . 我看到的错误是逻辑上的,因为您试图在另一个JPanel而不是实际的JFrame切换JPanel

See this small example I created (allows a user to alternate between 2 JPanel s on a single JFrame / container which implements a Singleton design pattern , can easily be changed for passing instance of MainGUI class to each JPanel the MainGUI spawns so that the JPanel s will have access to the single MainGUI s swapPanel(JPanel p) method): 参见我创建的这个小示例(允许用户在实现Singleton设计模式的单个JFrame / 容器上的2个JPanel之间交替,可以轻松更改以将MainGUI类的实例传递给MainGUI产生的每个JPanel ,以便JPanel将可以访问单个MainGUIswapPanel(JPanel p)方法):

在此处输入图片说明

在此处输入图片说明

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Test {

    public static void main(String[] args) {
        MainGUI mainGUI = MainGUI.getInstance();
    }
}
class MainGUI {

    private JFrame frame;

    private static class SingletonHolder {

        public static final MainGUI INSTANCE = new MainGUI();
    }

    public static MainGUI getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private MainGUI() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame = createJFrame();
                frame.setVisible(true);
            }
        });
    }

    private JFrame createJFrame() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Test");

        frame.add(new Panel1());//initial Jpanel to display

        frame.pack();
        return frame;
    }

    public void swapPanel(JPanel p) {
        frame.getContentPane().removeAll();
        frame.add(p);
        frame.pack();
        frame.revalidate();
        frame.repaint();
    }
}

class Panel1 extends JPanel {

    public Panel1() {
        JLabel labelPanel1 = new JLabel("Panel 1");
        JButton switchPanelButton = new JButton("Goto Panel 2");
        switchPanelButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainGUI.getInstance().swapPanel(new Panel2());
            }
        });
        add(labelPanel1);
        add(switchPanelButton);
    }
}

class Panel2 extends JPanel {

    public Panel2() {
        JLabel labelPanel1 = new JLabel("Panel 2");
        JButton switchPanelButton = new JButton("Goto Panel 1");
        switchPanelButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainGUI.getInstance().swapPanel(new Panel1());
            }
        });
        add(labelPanel1);
        add(switchPanelButton);
    }
}

An higher-level alternative to the above is a CardLayout The CardLayout class manages two or more components (usually JPanel instances) that share the same display space. CardLayout的更高级替代方法是CardLayout CardLayout类管理共享相同显示空间的两个或更多组件(通常是JPanel实例)。 :

在此处输入图片说明

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    private final static String PANEL1 = "panel 1";
    private final static String PANEL2 = "panel 2";

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("Panel 1"));

        JPanel panel2 = new JPanel();
        panel2.add(new JLabel("Panel 2"));

        //Create the panel that contains the "cards".
        final JPanel cards = new JPanel(new CardLayout());
        cards.add(panel1, PANEL1);
        cards.add(panel2, PANEL2);

        //create button to allow chnage to next card
        JButton buttonNext = new JButton(">");
        buttonNext.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                CardLayout cl = (CardLayout) (cards.getLayout());//get cards
                cl.next(cards);
            }
        });

        //create button to allow chnage to previous card
        JButton buttonPrev = new JButton("<");
        buttonPrev.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                CardLayout cl = (CardLayout) (cards.getLayout());//get cards
                cl.previous(cards);
            }
        });

        //create panel to hold buttons which will allow switching between cards
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(buttonPrev);
        buttonPanel.add(buttonNext);


        frame.add(cards);
        frame.add(buttonPanel, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM