ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 如何在JMenuItem上添加或更改标签?

2019-06-29 11:49:29  阅读:436  来源: 互联网

标签:java label swing menu jmenuitem


我需要在JMenuItem的右侧添加一个标签,如下面所示的标签:

我有一个使用Ctrl和Ctrl的应用程序 – 放大图像.但是,默认情况下(没有Shift键)键是=键.当我尝试为这些菜单项添加加速器时,Ctrl – 快捷方式标签显示为“Ctrl Minus”(我更喜欢“Ctrl – ”),Ctrl快捷键标签显示为“Ctrl Equals”(更糟糕的是 – 为了用户的利益)经验,我更喜欢“Ctrl”):

menuBar_view_zoomIn.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, ActionEvent.CTRL_MASK));

我希望Ctrl显示为“Ctrl”和Ctrl – 显示为“Ctrl – ”.如何才能做到这一点?

解决方法:

不是答案,你需要搜索

> paint()为重,paintComponent()为轻量级JPopup,JMenu(自定义绘图可以切换到isHeavyWeight ……)
>将JLabel叠加到容器中(@Guillaume Polet和@Robin对JTable的几个问题)
>创建自己的JMenu / JPopup(请参阅我对您的问题的评论)

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.plaf.basic.BasicArrowButton;

public class ComboBoxMenuExample extends JFrame {

    public ComboBoxMenuExample() {
        super("ComboBoxMenu Example");
        String[] itemStr = {"name", "Red", "Blue", "number", "255,0,0", "0,0,255",
            /*separator*/ "system", "control", "controlHighlight", "controlShadow", "text"};
        JMenuItem[] menuItems = new JMenuItem[7];
        menuItems[0] = new JMenuItem(itemStr[1]);
        menuItems[1] = new JMenuItem(itemStr[2]);
        menuItems[2] = new JMenuItem(itemStr[4]);
        menuItems[3] = new JMenuItem(itemStr[5]);
        menuItems[4] = new JMenuItem(itemStr[8]);
        menuItems[5] = new JMenuItem(itemStr[9]);
        menuItems[6] = new JMenuItem(itemStr[10]);
        JMenu[] menus = new JMenu[4];
        menus[0] = new JMenu(itemStr[0]);
        menus[1] = new JMenu(itemStr[3]);
        menus[2] = new JMenu(itemStr[6]);
        menus[3] = new JMenu(itemStr[7]);
        menus[0].add(menuItems[0]);
        menus[0].add(menuItems[1]);
        menus[1].add(menuItems[2]);
        menus[1].add(menuItems[3]);
        menus[3].add(menuItems[4]);
        menus[3].add(menuItems[5]);
        menus[2].add(menus[3]);
        menus[2].add(menuItems[6]);
        JMenu menu = ComboMenuBar.createMenu(menuItems[0].getText());
        menu.add(menus[0]);
        menu.add(menus[1]);
        menu.addSeparator();
        menu.add(menus[2]);
        ComboMenuBar comboMenu = new ComboMenuBar(menu);
        JComboBox combo = new JComboBox();
        combo.addItem(itemStr[1]);
        combo.addItem(itemStr[2]);
        combo.addItem(itemStr[4]);
        combo.addItem(itemStr[5]);
        combo.addItem(itemStr[8]);
        combo.addItem(itemStr[9]);
        combo.addItem(itemStr[10]);
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(new ComboPanel("Fake ComboBox", comboMenu));
        getContentPane().add(new ComboPanel("ComboBox", combo));
    }

    class ComboPanel extends JPanel {

        ComboPanel(String title, JComponent c) {
            setLayout(new FlowLayout());
            setBorder(new TitledBorder(title));
            add(c);
        }
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception evt) {
        }
        ComboBoxMenuExample frame = new ComboBoxMenuExample();
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setSize(370, 100);
        frame.setVisible(true);
    }
}

class ComboMenuBar extends JMenuBar {

    JMenu menu;
    Dimension preferredSize;

    public ComboMenuBar(JMenu menu) {
        this.menu = menu;
        Color color = UIManager.getColor("Menu.selectionBackground");
        UIManager.put("Menu.selectionBackground", UIManager.getColor("Menu.background"));
        UIManager.put("Menu.selectionBackground", color);
        menu.updateUI();
        MenuItemListener listener = new MenuItemListener();
        setListener(menu, listener);
        add(menu);
    }

    class MenuItemListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JMenuItem item = (JMenuItem) e.getSource();
            menu.setText(item.getText());
            menu.requestFocus();
        }
    }

    private void setListener(JMenuItem item, ActionListener listener) {
        if (item instanceof JMenu) {
            JMenu menu1 = (JMenu) item;
            int n = menu1.getItemCount();
            for (int i = 0; i < n; i++) {
                setListener(menu1.getItem(i), listener);
            }
        } else if (item != null) { // null means separator
            item.addActionListener(listener);
        }
    }

    public String getSelectedItem() {
        return menu.getText();
    }

    @Override
    public void setPreferredSize(Dimension size) {
        preferredSize = size;
    }

    @Override
    public Dimension getPreferredSize() {
        if (preferredSize == null) {
            Dimension sd = super.getPreferredSize();
            Dimension menuD = getItemSize(menu);
            Insets margin = menu.getMargin();
            Dimension retD = new Dimension(menuD.width, margin.top
                    + margin.bottom + menuD.height);
            menu.setPreferredSize(retD);
            preferredSize = retD;
        }
        return preferredSize;
    }

    private Dimension getItemSize(JMenu menu) {
        Dimension d = new Dimension(0, 0);
        int n = menu.getItemCount();
        for (int i = 0; i < n; i++) {
            Dimension itemD;
            JMenuItem item = menu.getItem(i);
            if (item instanceof JMenu) {
                itemD = getItemSize((JMenu) item);
            } else if (item != null) {
                itemD = item.getPreferredSize();
            } else {
                itemD = new Dimension(0, 0); // separator
            }
            d.width = Math.max(d.width, itemD.width);
            d.height = Math.max(d.height, itemD.height);
        }
        return d;
    }

    public static class ComboMenu extends JMenu {

        ArrowIcon iconRenderer;

        public ComboMenu(String label) {
            super(label);
            iconRenderer = new ArrowIcon(SwingConstants.SOUTH, true);
            setBorder(new EtchedBorder());
            setIcon(new BlankIcon(null, 11));
            setHorizontalTextPosition(JButton.LEFT);
            setFocusPainted(true);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Dimension d = this.getPreferredSize();
            int x = Math.max(0, d.width - iconRenderer.getIconWidth() - 3);
            int y = Math.max(0,
                    (d.height - iconRenderer.getIconHeight()) / 2 - 2);
            iconRenderer.paintIcon(this, g, x, y);
        }
    }

    public static JMenu createMenu(String label) {
        return new ComboMenu(label);
    }
}

class ArrowIcon implements Icon, SwingConstants {

    private static final int DEFAULT_SIZE = 11;
    //private static final int DEFAULT_SIZE = 5;
    private int size;
    private int iconSize;
    private int direction;
    private boolean isEnabled;
    private BasicArrowButton iconRenderer;

    public ArrowIcon(int direction, boolean isPressedView) {
        this(DEFAULT_SIZE, direction, isPressedView);
    }

    public ArrowIcon(int iconSize, int direction, boolean isEnabled) {
        this.size = iconSize / 2;
        this.iconSize = iconSize;
        this.direction = direction;
        this.isEnabled = isEnabled;
        iconRenderer = new BasicArrowButton(direction);
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        iconRenderer.paintTriangle(g, x, y, size, direction, isEnabled);
    }

    @Override
    public int getIconWidth() {
        //int retCode;
        switch (direction) {
            case NORTH:
            case SOUTH:
                return iconSize;
            case EAST:
            case WEST:
                return size;
        }
        return iconSize;
    }

    @Override
    public int getIconHeight() {
        switch (direction) {
            case NORTH:
            case SOUTH:
                return size;
            case EAST:
            case WEST:
                return iconSize;
        }
        return size;
    }
}

class BlankIcon implements Icon {

    private Color fillColor;
    private int size;

    public BlankIcon() {
        this(null, 11);
    }

    public BlankIcon(Color color, int size) {
        //UIManager.getColor("control")
        //UIManager.getColor("controlShadow")
        fillColor = color;
        this.size = size;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        if (fillColor != null) {
            g.setColor(fillColor);
            g.drawRect(x, y, size - 1, size - 1);
        }
    }

    @Override
    public int getIconWidth() {
        return size;
    }

    @Override
    public int getIconHeight() {
        return size;
    }
}

标签:java,label,swing,menu,jmenuitem
来源: https://codeday.me/bug/20190629/1325957.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有