有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将垂直文本添加到JMenu

我想在JMenu中添加垂直文本。如图所示(“JTattoo”):

enter image description here

我在谷歌上搜索,但没有找到方法

任何信息都会对我有帮助

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    扩展JMenuItem和重写paintComponent将不起作用,因为文本跨越多个菜单项

    您要做的是在JMenu的弹出菜单中添加自定义边框

    下面是一个例子:

    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.RenderingHints;
    import java.awt.geom.AffineTransform;
    
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.border.Border;
    public class Main {
    
        public static void main(final String[] args) {
            final JFrame frame = new JFrame();
            final JMenu menu = new JMenu("Menu");
            menu.add("Hello");
            menu.add("World");
            menu.getPopupMenu().setBorder(new VerticalTextBorder());
            final JMenuBar menubar = new JMenuBar();
            menubar.add(menu);
            frame.setJMenuBar(menubar);
            frame.setSize(300,300);
            frame.setVisible(true);
        }
    
        private static class VerticalTextBorder implements Border {
            @Override
            public Insets getBorderInsets(final Component c) {
                return new Insets(0, 15, 0, 0);
            }
    
            @Override
            public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, final int height) {
                final Graphics2D g2 = (Graphics2D)g;
                final AffineTransform fontAT = new AffineTransform();
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                fontAT.rotate(-Math.PI/2);
                g2.setFont(g2.getFont().deriveFont(fontAT));
                g2.drawString("Menu", 10, height);
            }
    
            @Override
            public boolean isBorderOpaque() {
                return false;
            }
        }
    }
    
  2. # 2 楼答案

    您可以将JMenuItem子类化,然后通过重写paintComponent来更改它的呈现方式