【问题标题】:How do I create this special menu bar with Java Swing?如何使用 Java Swing 创建这个特殊的菜单栏?
【发布时间】:2012-05-06 04:06:21
【问题描述】:

我正在尝试使用 Swing 实现这种类型的菜单。是否有现成的解决方案(免费和/或商业)?

【问题讨论】:

    标签: java swing icons jmenu jmenuitem


    【解决方案1】:

    假设您想在菜单上显示该图像,为什么不这样呢?

    BufferedImage image = ImageIO.read(url);
    
    yourJMenu.setHorizontalTextPosition(SwingConstants.CENTER);
    yourJMenu.setVerticalTextPosition(SwingConstants.BOTTOM);
    
    yourJMenu.setIcon(new ImageIcon(image));
    

    编辑:您似乎要求从头开始。

    阅读本答案前请参考:How to Use Menus


    EDIT 2:这是SSCCE

    import java.awt.image.BufferedImage;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.SwingConstants;
    
    public class MenuTest {
    
        public static void main(String[] argv) throws Exception {
            // Create the menu bar
            JMenuBar menuBar = new JMenuBar();
    
            String imageURL = "http://blogs.discovermagazine.com/" +
                "drone360/wp-content/themes/discoverblog/images/" +
                "gear_icon.png";
    
            // Create a menu
            JMenu menu = new JMenu("Menu");
            BufferedImage image = ImageIO.read(new URL(imageURL));
            menu.setHorizontalTextPosition(SwingConstants.CENTER);
            menu.setVerticalTextPosition(SwingConstants.BOTTOM);
            menu.setIcon(new ImageIcon(image));
            menuBar.add(menu);
    
            // Create a menu item
            JMenuItem item = new JMenuItem("Test Item");
    
            menu.add(item);
    
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.setJMenuBar(menuBar);
            frame.setSize(500, 550);
            frame.setVisible(true);
        }
    }
    

    资源礼貌:http://pscode.org/media/

    【讨论】:

    • 嗨,Sanjay,我需要的是某种下拉按钮,但外观和感觉与屏幕截图中的完全相同(图标下的文字)。
    • 图片大多是Application Resources,它们应该通过URL而不是File的方式访问,所以恕我直言,写ImageIO.read(url);将是一个更明智的方法:-)
    • 谢谢大家。我试试看:D
    【解决方案2】:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.JCheckBoxMenuItem;
    import javax.swing.JRadioButtonMenuItem;
    import javax.swing.ButtonGroup;
    import javax.swing.JMenuBar;
    import javax.swing.KeyStroke;
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JScrollPane;
    import javax.swing.JFrame;
    
    /* MenuLookDemo.java requires images/middle.gif. */
    /*
     * This class exists solely to show you what menus look like.
     * It has no menu-related event handling.
     */
    public class MenuLookDemo {
        JTextArea output;
        JScrollPane scrollPane;
        public JMenuBar createMenuBar() {
            JMenuBar menuBar;
            JMenu menu, submenu;
            JMenuItem menuItem;
            JRadioButtonMenuItemMenuItem;
            JCheckBoxMenuItem cbMenuItem;
            //Create the menu bar.
            menuBar = new JMenuBar();
            //Build the first menu.
            menu = new JMenu("A Menu");
            menu.setMnemonic(KeyEvent.VK_A);
            menu.getAccessibleContext().setAccessibleDescription("The only menu in this program that has menu items");
            menuBar.add(menu);
            //a group of JMenuItems
            menuItem = new JMenuItem("Av text-only menu item", KeyEvent.VK_T);
            //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));
            menuItem.getAccessibleContext().setAccessibleDescription("This doesn't really do anything");
            menu.add(menuItem);
            ImageIcon icon = createImageIcon("middle.gif");
            menuItem = new JMenuItem("Both text and icon", icon);
            menuItem.setMnemonic(KeyEvent.VK_B);
            menu.add(menuItem);
            menuItem = new JMenuItem(icon);
            menuItem.setMnemonic(KeyEvent.VK_D);
            menu.add(menuItem);
            //a group of radio button menu items
            menu.addSeparator();
            ButtonGroup group = new ButtonGroup();
            rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
            rbMenuItem.setSelected(true);
            rbMenuItem.setMnemonic(KeyEvent.VK_R);
            group.add(rbMenuItem);
            menu.add(rbMenuItem);
            rbMenuItem = new JRadioButtonMenuItem("Another one");
            rbMenuItem.setMnemonic(KeyEvent.VK_O);
            group.add(rbMenuItem);
            menu.add(rbMenuItem);
            //a group of check box menu items
            menu.addSeparator();
            cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
            cbMenuItem.setMnemonic(KeyEvent.VK_C);
            menu.add(cbMenuItem);
            cbMenuItem = new JCheckBoxMenuItem("Another one");
            cbMenuItem.setMnemonic(KeyEvent.VK_H);
            menu.add(cbMenuItem);
            //a submenu
            menu.addSeparator();
            submenu = new JMenu("A submenu");
            submenu.setMnemonic(KeyEvent.VK_S);
            menuItem = new JMenuItem("An item in the submenu");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
            submenu.add(menuItem);
            menuItem = new JMenuItem("Another item");
            submenu.add(menuItem);
            menu.add(submenu);
            //Build second menu in the menu bar.
            menu = new JMenu("Another Menu");
            menu.setMnemonic(KeyEvent.VK_N);
            menu.getAccessibleContext().setAccessibleDescription("This menu does nothing");
            menuBar.add(menu);
            return menuBar;
        }
        public Container createContentPane() {
            //Create the content-pane-to-be.
            JPanel contentPane = new JPanel(new BorderLayout());
            contentPane.setOpaque(true);
            //Create a scrolled text area.
            output = new JTextArea(5, 30);
            output.setEditable(false);
            scrollPane = new JScrollPane(output);
            //Add the text area to the content pane.
            contentPane.add(scrollPane, BorderLayout.CENTER);
            return contentPane;
        }
        /** Returns an ImageIcon, or null if the path was invalid. */
        protected static ImageIcon createImageIcon(String path) {
            java.net.URL imgURL = MenuLookDemo.class.getResource(path);
            if (imgURL != null) {
                return new ImageIcon(imgURL);
            } else {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
        * event-dispatching thread.
         */
         private static void createAndShowGUI() {
             //Create and set up the window.
            JFrame frame = new JFrame("MenuLookDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Create and set up the content pane.
            MenuLookDemo demo = new MenuLookDemo();
            frame.setJMenuBar(demo.createMenuBar());
            frame.setContentPane(demo.createContentPane());
            //Display the window.
            frame.setSize(450, 260);
            frame.setVisible(true);
        }
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    【讨论】:

    • 请编辑您的答案并格式化代码以使其可读(在输入框的后上角有一个问号按钮,引用标签帮助)
    • 选择你的代码并点击{}按钮格式化代码。
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多