Java 如何添加或更改JMenuItem上的标签?

Java 如何添加或更改JMenuItem上的标签?,java,swing,menu,label,jmenuitem,Java,Swing,Menu,Label,Jmenuitem,我需要在JMenuItem的右侧添加一个标签,如下所示: 我有一个应用程序,它使用Ctrl++和Ctrl+-来放大图像。但是,默认情况下+键(不带Shift)是=键。当我尝试为这些菜单项添加快捷键时,Ctrl+-快捷键标签显示为“Ctrl+减号”(我更喜欢“Ctrl-”),Ctrl++快捷键标签显示为“Ctrl+相等”(更糟糕的是,为了用户体验,我更喜欢“Ctrl+”): 我希望Ctrl++显示为“Ctrl+”,Ctrl+-显示为“Ctrl-”。如何做到这一点?不是答案,您需要搜索 pai

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

我有一个应用程序,它使用Ctrl++和Ctrl+-来放大图像。但是,默认情况下+键(不带Shift)是=键。当我尝试为这些菜单项添加快捷键时,Ctrl+-快捷键标签显示为“Ctrl+减号”(我更喜欢“Ctrl-”),Ctrl++快捷键标签显示为“Ctrl+相等”(更糟糕的是,为了用户体验,我更喜欢“Ctrl+”):


我希望Ctrl++显示为“Ctrl+”,Ctrl+-显示为“Ctrl-”。如何做到这一点?

不是答案,您需要搜索

  • paint()为重型,paintComponent()为轻型JPopup,JMenu(对于自定义绘制,可切换为ISHEAVYWWATTE…)

  • 将JLabel覆盖到容器中(关于@Guillaume Polet和@Robin编写的JTable的问题很少)

  • 创建自己的JMenu/JPopup(请参阅我对您的问题的评论)

导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.Insets;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入javax.swing.Icon;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.SwingConstants;
导入javax.swing.UIManager;
导入javax.swing.border.EtchedBorder;
导入javax.swing.border.TitledBorder;
导入javax.swing.plaf.basic.BasicArrowButton;
公共类ComboBoxMenuExample扩展了JFrame{
公共ComboxMenueXample(){
超级(“ComboBoxMenu示例”);
字符串[]itemStr={“名称”、“红色”、“蓝色”、“数字”、“255,0,0”、“0,0255”,
/*分隔符*/“系统”、“控件”、“控件突出显示”、“控件阴影”、“文本”};
JMenuItem[]菜单项=新的JMenuItem[7];
menuItems[0]=新的JMenuItem(itemStr[1]);
menuItems[1]=新的JMenuItem(itemStr[2]);
menuItems[2]=新的JMenuItem(itemStr[4]);
menuItems[3]=新的JMenuItem(itemStr[5]);
menuItems[4]=新的JMenuItem(itemStr[8]);
menuItems[5]=新的JMenuItem(itemStr[9]);
menuItems[6]=新的JMenuItem(itemStr[10]);
JMenu[]菜单=新JMenu[4];
菜单[0]=新的JMenu(itemStr[0]);
菜单[1]=新的JMenu(itemStr[3]);
菜单[2]=新的JMenu(itemStr[6]);
菜单[3]=新的JMenu(itemStr[7]);
菜单[0]。添加(菜单项[0]);
菜单[0]。添加(菜单项[1]);
菜单[1]。添加(菜单项[2]);
菜单[1]。添加(菜单项[3]);
菜单[3]。添加(菜单项[4]);
菜单[3]。添加(菜单项[5]);
菜单[2]。添加(菜单[3]);
菜单[2]。添加(菜单项[6]);
JMenu menu=ComboMenuBar.createMenu(menuItems[0].getText());
菜单。添加(菜单[0]);
菜单。添加(菜单[1]);
menu.addSeparator();
菜单。添加(菜单[2]);
ComboMenuBar comboMenu=新建ComboMenuBar(菜单);
JComboBox组合=新的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(新的FlowLayout());
getContentPane().add(新建组合面板(“假组合框”,组合菜单));
getContentPane().add(新的组合面板(“组合框”,组合));
}
类ComboPanel扩展了JPanel{
ComboPanel(字符串标题,JComponent c){
setLayout(新的FlowLayout());
收尾订单(新标题边界(标题));
添加(c);
}
}
公共静态void main(字符串参数[]){
试一试{
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”);
}捕获(异常evt){
}
ComboBoxMenuExample框架=新建ComboxMenueXample();
frame.addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
});
框架设置尺寸(370100);
frame.setVisible(true);
}
}
类ComboMenuBar扩展了JMenuBar{
JMenu菜单;
尺寸优先尺寸;
公共组合菜单栏(JMenu菜单){
this.menu=菜单;
Color=UIManager.getColor(“Menu.selectionBackground”);
UIManager.put(“Menu.selectionBackground”,UIManager.getColor(“Menu.background”);
UIManager.put(“Menu.selectionBackground”,颜色);
menu.updateUI();
MenuItemListener listener=新建MenuItemListener();
setListener(菜单,listener);
添加(菜单);
}
类MenuItemListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
JMenuItem=(JMenuItem)e.getSource();
menu.setText(item.getText());
menu.requestFocus();
}
}
私有void setListener(JMenuItem项,ActionListener侦听器){
if(JMenu的项目实例){
JMenu菜单1=(JMenu)项;
int n=menu1.getItemCount();
对于(int i=0;imenuBar_view_zoomIn.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, ActionEvent.CTRL_MASK));
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;
    }
}