JMenuItem无法动态添加组件

时间:2012-07-22 23:14:24

标签: java swing jframe cardlayout jmenu

我有一个JMenuBar的框架。当我按下其中一个JMenuItems我想在框架中添加JLabel时,它不起作用。我不明白......它在同一个班级。

public class GuiMain {
    private JLabel logo_headsup;
    JFrame frame1 = new JFrame();
    JMenuBar menubar;

    // other stuff
    public GuiMain() {
        frame1.setLayout(null);
        logo_headsup = new JLabel(new ImageIcon(getClass().getResource(
                "logo_headsup.png")));
        logo_headsup.setBounds(headImage.getWidth() + 2, 120, 271, 46);
        menubar = new JMenuBar();
        menubar.setOpaque(false);
        menubar.setBorderPainted(false);
        menubar.setBounds(0, 0, 750, 30);

        JMenu view = new JMenu("View");
        view.setMnemonic('V');
        view.setFont(new Font("Verdana", Font.BOLD, 10));
        Color myColor = new Color(192, 0, 0);
        view.setForeground(myColor);
        JMenuItem hu = new JMenuItem("Heads-up");
        JMenuItem sh = new JMenuItem("Short-handed");
        JMenuItem fr = new JMenuItem("Full-ring");

        hu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("You pressed headsup"); // testing & it works
                frame1.remove(logo_fullring);
                frame1.remove(logo_shorthanded);
                frame1.add(logo_headsup).repaint(); // now it`s working

            }
        });
        view.add(hu);
        view.add(sh);
        view.add(fr);
        menubar.add(view);
    }
}

1 个答案:

答案 0 :(得分:3)

我强烈推荐Andrew Thompson使用CardLayout的建议,因为这简化了一切。使用带有CardLayout的JMenu的示例:

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Swapper {
   private static final String BLUEPRINT = "http://duke.kenai.com/IPG/Duke_Blueprint.gif";
   private static final String COOKIES = "http://duke.kenai.com/IPG/Duke_Cookies.gif";
   private static final String INT_FLOAT_CHAR = "http://duke.kenai.com/IPG/Duke_Int_Float_Char.gif";
   private static final String THREAD = "http://duke.kenai.com/IPG/Duke_Thread.gif";

   private JPanel mainPanel = new JPanel();
   private JMenu menu = new JMenu("Menu");
   private JMenuBar menuBar = new JMenuBar();
   private CardLayout cardlayout = new CardLayout();

   public Swapper() {
      mainPanel.setLayout(cardlayout);
      mainPanel.setBackground(Color.white);
      addCard("Blueprint", BLUEPRINT);
      addCard("Cookies", COOKIES);
      addCard("Int Float Char", INT_FLOAT_CHAR);
      addCard("Thread", THREAD);

      menuBar.add(menu);
   }

   private void addCard(String name, String imagePath) {
      BufferedImage img;
      try {
         URL imgUrl = new URL(imagePath);
         img = ImageIO.read(imgUrl);
         ImageIcon icon = new ImageIcon(img);
         JLabel label = new JLabel(icon);
         mainPanel.add(label, name);
         menu.add(new JMenuItem(new MenuAction(name)));

      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public JComponent getMainPanel() {
      return mainPanel;
   }

   public JMenuBar getMenuBar() {
      return menuBar;
   }

   private class MenuAction extends AbstractAction {

      public MenuAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         String name = getValue(NAME).toString();
         cardlayout.show(mainPanel, name);
      }
   }

   private static void createAndShowGui() {
      Swapper swapper = new Swapper();

      JFrame frame = new JFrame("Swapper");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(swapper.getMainPanel());
      frame.setJMenuBar(swapper.getMenuBar());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这导致:

enter image description here enter image description here