Swing菜单项选择未在内容窗格中设置内容 [英] Swing menu item selection not setting content in the contentpane

查看:33
本文介绍了Swing菜单项选择未在内容窗格中设置内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Swing JFrame,其中包含许多菜单项.下面的代码尝试但未在选择添加地址"菜单项时设置JFrame的内容.

I have a Swing JFrame, which has a bunch of menu items. The below code tries but fails to set the content of the JFrame on selection of 'Add Address' menu item.

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

}

当我选择添加地址"菜单项时,框架只是空白.不是我所期望的.我使用断点进行调试,发现正在调用设置地址的方法. 我不知道为什么它不起作用.有人可以指出我在这里做错了什么吗吗?

When I select the 'Add Address' menu item, the frame just goes blank. Not what I expected. I debugged using break point and see that the method to setup the address is being called. I can't figure out why it doesn't work. Could any one point out if I am doing anything wrong here?

推荐答案

为什么要经历所有这些体操?相反,只需使用 CardLayout 即可以最少的混乱为您交换视图或大惊小怪.

Why go through all this gymnastics? Instead simply use a CardLayout to swap views for you with minimal mess or fuss.

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

Also note that the JFrame you create on line (A) in either a method or constructor (you don't say):

JFrame frame = new JFrame(); // (A)

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

is not the same JFrame as the one used on lines (B) and (C):

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

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

这是因为您在(A)行上声明了JFrame,因此它仅在该方法或构造函数中可见.

This is because you declare the JFrame on line (A) and so it is only visible within that method or constructor.

编辑1
另外,这是不对的:

Edit 1
Also, this is not right:

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

因为这不是您将新组件显示在Swing容器中的方式.相反,我会做这样的事情:

As that's not how you get new components to show in a container for Swing. Instead I'd do something like so:

  JPanel contentPane = (JPanel) frame.getContentPane();
  contentPane.revalidate();
  contentPane.repaint();

但是,我仍然不会做任何事情,而是使用如上所述的CardLayout.

But again, I'd really do neither, and instead would use a CardLayout as noted above.

最后,如果这些建议中的任何一项都没有道理,请要求澄清.

Finally, if any of these recommendations don't make sense, please ask for clarification.

这篇关于Swing菜单项选择未在内容窗格中设置内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆