我正在申请处理客户订单(在java中)。
我的程序有3个JFrame
窗口(是的,我知道使用多个框架并不是一个好主意,但它们并没有真正相互连接)。
JFrame
JFrame
客户下订单后(主框架>客户框架>完成订单(按钮)。我正在做这样的事情:
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
,但问题是听众不再工作,我猜他们会以某种方式保持与旧框架或其他东西的连接。
我一直试图让它工作几个小时......
答案 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");