多个JFrame

时间:2016-03-19 19:04:02

标签: java swing jframe

我正在申请处理客户订单(在java中)。 我的程序有3个JFrame窗口(是的,我知道使用多个框架并不是一个好主意,但它们并没有真正相互连接)。

  1. 主要的一个:在这里您选择自己(客户或运营商)
  2. 客户JFrame
  3. 运营商JFrame
  4. 客户下订单后(主框架>客户框架>完成订单(按钮)。我正在做这样的事情:

    customerframe.dispose();
    customerframe.revalidate();
    customerframe.repaint();
    reloadframe(); ///a method which reinitializes the frame (Note: I am doing a frame=new JFrame()  here)
    mainframe.setVisible(true);
    

    我再次选择客户它会打开customerframe,但问题是听众不再工作,我猜他们会以某种方式保持与旧框架或其他东西的连接。

    我一直试图让它工作几个小时......

1 个答案:

答案 0 :(得分:4)

您不应该使用多个JFrames请参阅this链接以获取更多信息。

相反,我建议你使用CardLayout,如下所示:

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

public class MainFrame
{
    static JPanel homeContainer;
    static CardLayout cl;

    JPanel homePanel;
    JPanel otherPanel;


    public MainFrame()
    {
        JFrame mFrame = new JFrame("CardLayout Example");
        JButton showOtherPanelBtn = new JButton("Show Other Panel");
        JButton backToHomeBtn = new JButton("Show Home Panel");

        cl = new CardLayout(5, 5);
        homeContainer = new JPanel(cl);
        homeContainer.setBackground(Color.black);

        homePanel = new JPanel();
        homePanel.setBackground(Color.blue);
        homePanel.add(showOtherPanelBtn);

        homeContainer.add(homePanel, "Home");

        otherPanel = new JPanel();
        otherPanel.setBackground(Color.green);
        otherPanel.add(backToHomeBtn);

        homeContainer.add(otherPanel, "Other Panel");

        showOtherPanelBtn.addActionListener(e -> cl.show(homeContainer, "Other Panel"));
        backToHomeBtn.addActionListener(e -> cl.show(homeContainer, "Home"));

        mFrame.add(homeContainer);
        cl.show(homeContainer, "Home");
        mFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mFrame.setLocationRelativeTo(null);
        mFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        mFrame.pack();
        mFrame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(MainFrame::new);
    }
}

使用Cardlayout,您可以在JPanel之间切换。这样,您不必创建新的JFrame,只是为了显示新内容。基本上,你有某种容器,(可能是JFrame或可能是JPanel),然后,当你添加你创建的其他面板时,你给它们一个名字。然后,您可以使用cardLayout.show(container, "Name");

在面板之间切换