0

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

我的主要课程:

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

我的客户新:

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 类的组件,管理这样的程序的更好选择是什么?

4

1 回答 1

5

好吧,除了您没有发布完整的源代码或SSCCE 之外,我无法完全测试。

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

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

请参阅我创建的这个小示例(允许用户在实现Singleton 设计模式JPanel的单个JFrame/容器上的2 s 之间交替,可以轻松更改以将类实例传递给每个spawn ,以便s 可以访问单个方法):MainGUIJPanelMainGUIJPanelMainGUIswapPanel(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);
    }
}

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

在此处输入图像描述

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);
    }
}
于 2013-06-26T18:38:47.210 回答