2012-07-22 102 views
0

我有一個框架JMenuBar。當我按JMenuItems其中之一時,我想添加一個JLabel到框架,它不起作用。我不明白......它在同一班。JMenuItem無法動態添加組件

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); 
    } 
} 
+0

是否打印 「您按下hedsup」 安慰使用JMenu,用一個CardLayout的例子嗎? – 2012-07-22 23:17:35

+4

1)不要使用空佈局2)在添加或刪除組件後,不要忘了重新繪製()和重新驗證()你的容器。 – 2012-07-22 23:18:00

+0

@Lablabla是的,它打印到控制檯我的消息 – que1326 2012-07-22 23:20:04

回答

3

我強烈要求第二次安德魯湯普森推薦使用CardLayout,因爲這樣可以簡化一切。

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 hereenter image description here

+0

非常感謝! – que1326 2012-07-23 11:41:19