从actionlistener调用swing JPanels

时间:2013-06-26 18:04:53

标签: java swing jpanel jbutton actionlistener

我正在使用各种类编码一个项目,但是当我按下一个调用我的主菜单的按钮时,我就卡住了,这里是我的恢复代码:

我的主要课程:

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); 
    }
});`

现在,我的校长:

 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();

    }


    }

嗯,对不起那张墙文字,但我很遗憾,我只想打电话给我的DetallesPrincipal课程的组件,管理这样的程序有什么更好的选择?

1 个答案:

答案 0 :(得分:5)

除了你没有发布完整的来源或SSCCE我无法完全测试的事实。

查看代码,您使用removeAll()方法在单个JPanel / 容器上的多个JFrame之间切换。

我看到你犯的错误是在逻辑上,因为你试图在另一个JPanel内而不是在实际的JPanel内切换JFrame

请参阅我创建的这个小示例(允许用户在实现Singleton design pattern的单个JPanel / 容器上的2 JFrame之间切换,可以可以轻松更改,以便将MainGUI类的实例传递给每个JPanel MainGUI个生成器,以便JPanel s可以访问单个MainGUI s {{ 1}}方法):

enter image description here

enter image description here

swapPanel(JPanel p)

上述的更高级替代方法是CardLayout CardLayout类管理共享相同显示空间的两个或多个组件(通常是JPanel实例)。

enter image description here

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);
    }
}