Java Swing菜单项选择未设置contentpane中的内容

Java Swing菜单项选择未设置contentpane中的内容,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我有一个Swing JFrame,它有一堆菜单项。下面的代码尝试在选择“添加地址”菜单项时设置JFrame的内容,但失败 JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setVisible(true); JMenuBar menuBar = new JMenuB

我有一个Swing JFrame,它有一堆菜单项。下面的代码尝试在选择“添加地址”菜单项时设置JFrame的内容,但失败

        JFrame frame = new JFrame();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setVisible(true);

    JMenuBar menuBar = new JMenuBar();
    JMenu clientMenu = new JMenu("Client");
    JMenuItem address = new JMenuItem("Add Address");

    clientMenu.add(address);
    menuBar.add(clientMenu);

    address.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            setupAddressForm();
        }
    });

    private void setupAddressForm() {
        frame.getContentPane().removeAll();

        JPanel infoPanel = new JPanel();
        JLabel infoLabel = new JLabel();
        infoLabel.setText("<html><B>Please enter the address below</B></html>");
        infoPanel.add(infoLabel, SwingConstants.CENTER);
        frame.getContentPane().add(infoPanel, BorderLayout.NORTH);

        JPanel buttonPanel = new JPanel();
        JButton submitButton = new JButton("Submit Address");
        JButton resetButton = new JButton("Reset");

        submitButton.setToolTipText("Submit");
        resetButton.setToolTipText("Reset");

        buttonPanel.add(submitButton);
        buttonPanel.add(resetButton);

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

        JPanel fieldPanel = new JPanel();
        fieldPanel.setLayout(new GridLayout(10, 10));

        JLabel houseNumberLabel = new JLabel("House Number",
                SwingConstants.LEFT);
        final JTextField houseNumberField = new JTextField(3);

        JLabel streetNameLabel = new JLabel("Street Name", SwingConstants.LEFT);
        final JTextField streetNameField = new JTextField(10);

        JLabel localityLabel = new JLabel("Locality", SwingConstants.LEFT);
        final JTextField localityField = new JTextField(10);

        JLabel cityLabel = new JLabel("City", SwingConstants.LEFT);
        final JTextField cityField = new JTextField(10);

        JLabel stateLabel = new JLabel("State", SwingConstants.LEFT);
        final JTextField stateField = new JTextField(10);

        JLabel zipCodeLabel = new JLabel("Zip Code", SwingConstants.LEFT);
        final JTextField zipCodeField = new JTextField(10);

        fieldPanel.add(houseNumberLabel);
        fieldPanel.add(houseNumberField);

        fieldPanel.add(streetNameLabel);
        fieldPanel.add(streetNameField);

        fieldPanel.add(localityLabel);
        fieldPanel.add(localityField);

        fieldPanel.add(cityLabel);
        fieldPanel.add(cityField);

        fieldPanel.add(stateLabel);
        fieldPanel.add(stateField);

        fieldPanel.add(zipCodeLabel);
        fieldPanel.add(zipCodeField);

        frame.getContentPane().add(fieldPanel, BorderLayout.CENTER);

        submitButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String houseNumber = houseNumberField.getText();
                String street = streetNameField.getText();
                String locality = localityField.getText();
                String city = cityField.getText();
                String state = stateField.getText();
                String zipCode = zipCodeField.getText();

                Address address = new Address();

                if (!"".equals(houseNumber) && !"".equals(street)
                        && !"".equals(locality) && !"".equals(city)
                        && !"".equals(state) && !"".equals(zipCode)) {
                    address.setHouseNumber(houseNumber);
                    address.setStreetName(street);
                    address.setLocality(locality);
                    address.setState(state);
                    address.setZipCode(zipCode);
                }

            }
        });

        frame.getContentPane().doLayout();
        frame.getContentPane().update(frame.getGraphics());

}
JFrame=newjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setresizeable(false);
frame.setVisible(true);
JMenuBar menuBar=新的JMenuBar();
JMenu客户端菜单=新JMenu(“客户端”);
JMenuItem地址=新的JMenuItem(“添加地址”);
clientMenu.add(地址);
菜单栏。添加(客户端菜单);
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
setupAddressForm();
}
});
私有void setupAddressForm(){
frame.getContentPane().removeAll();
JPanel infoPanel=新的JPanel();
JLabel infoLabel=新的JLabel();
infoLabel.setText(“请在下面输入地址”);
infoPanel.add(infoLabel,SwingConstants.CENTER);
frame.getContentPane().add(infoPanel,BorderLayout.NORTH);
JPanel buttonPanel=新的JPanel();
JButton submitButton=新JButton(“提交地址”);
JButton resetButton=新JButton(“重置”);
submitButton.setToolTipText(“提交”);
resetButton.setToolTipText(“重置”);
按钮面板。添加(提交按钮);
按钮面板。添加(重置按钮);
frame.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
JPanel fieldPanel=新的JPanel();
fieldPanel.setLayout(新网格布局(10,10));
JLabel houseNumberLabel=新的JLabel(“房屋编号”,
SwingConstants.左);
最终JTextField houseNumberField=新JTextField(3);
JLabel streetNameLabel=新的JLabel(“街道名称”,SwingConstants.LEFT);
最终JTextField streetNameField=新JTextField(10);
JLabel localityLabel=新的JLabel(“Locality”,SwingConstants.LEFT);
最终JTextField localityField=新JTextField(10);
JLabel cityLabel=新JLabel(“城市”,SwingConstants.LEFT);
最终JTextField cityField=新的JTextField(10);
JLabel stateLabel=新的JLabel(“状态”,SwingConstants.LEFT);
最终JTextField stateField=新JTextField(10);
JLabel zipCodeLabel=新的JLabel(“邮政编码”,SwingConstants.LEFT);
最终JTextField zipCodeField=新JTextField(10);
fieldPanel.add(房屋编号标签);
fieldPanel.add(房屋编号字段);
fieldPanel.add(街道名称标签);
fieldPanel.add(街道名称字段);
fieldPanel.add(localityLabel);
fieldPanel.add(localityField);
fieldPanel.add(城市标签);
fieldPanel.add(城市域);
fieldPanel.add(状态标签);
fieldPanel.add(stateField);
fieldPanel.add(zipCodeLabel);
fieldPanel.add(zipCodeField);
frame.getContentPane().add(fieldPanel,BorderLayout.CENTER);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
字符串houseNumber=houseNumberField.getText();
String street=streetNameField.getText();
String locality=localityField.getText();
字符串city=cityField.getText();
String state=stateField.getText();
字符串zipCode=zipCodeField.getText();
地址=新地址();
如果(!“”.equals(门牌号)和(!“”.equals(街道)
&&!“”.equals(地区)和&!“”.equals(城市)
&&!“”.equals(状态)和&&!“”.equals(zipCode)){
地址:setHouseNumber(房屋编号);
地址:setStreetName(街道);
地址。设置地点(地点);
地址:setState(州);
地址:setZipCode(zipCode);
}
}
});
frame.getContentPane().doLayout();
frame.getContentPane().update(frame.getGraphics());
}
当我选择“添加地址”菜单项时,框架将变为空白。不是我所期望的。我使用断点进行了调试,发现正在调用设置地址的方法。
我不明白为什么它不起作用。有人能指出我是否做错了什么吗?

为什么要做这些体操?相反,只需使用一个简单的工具来为您交换视图,以减少混乱或麻烦

还请注意,您在方法或构造函数的第(A)行中创建的JFrame(您没有说):

与第(B)和(C)行中使用的JFrame不同:

因为这不是让新组件显示在Swing容器中的方式。相反,我会这样做:

  JPanel contentPane = (JPanel) frame.getContentPane();
  contentPane.revalidate();
  contentPane.repaint();
但是,我真的不会这样做,而是会使用上面提到的CardLayout


最后,如果这些建议中的任何一个没有意义,请要求澄清。

为什么要做这些练习?相反,只需使用一个简单的工具来为您交换视图,以减少混乱或麻烦

还请注意,您在方法或构造函数的第(A)行中创建的JFrame(您没有说):

与第(B)和(C)行中使用的JFrame不同:

因为这不是让新组件显示在Swing容器中的方式。相反,我会这样做:

  JPanel contentPane = (JPanel) frame.getContentPane();
  contentPane.revalidate();
  contentPane.repaint();
但是,我真的不会这样做,而是会使用上面提到的CardLayout


最后,如果这些建议中的任何一个没有意义,请要求澄清。

“这是因为您在(A)行声明了JFrame,因此它仅在该方法或构造函数中可见。”我没有发布上面的完整代码。但是CardLayout解决了我的问题。谢谢您的解决方案。@sachinrahulsourav:不客气,我认为您使用的CardLayout是完成这项工作的最佳工具。“这是因为您在(A)行声明了JFrame,因此它仅在该方法或构造函数中可见。”
  frame.getContentPane().doLayout();
  frame.getContentPane().update(frame.getGraphics());
  JPanel contentPane = (JPanel) frame.getContentPane();
  contentPane.revalidate();
  contentPane.repaint();