Добавить вертикальный текст в JMenu - PullRequest
3 голосов
/ 22 февраля 2012

Я хочу добавить вертикальный текст в JMenu. Как показано на рисунке («JTattoo»):

enter image description here

Я ищу в Google, но не могу найти способ сделать это.

Любая информация будет полезна для меня.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Расширение 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;
        }
    }
}
0 голосов
/ 02 марта 2012

Вы можете создать подкласс JMenuItem, а затем изменить способ его визуализации путем переопределения paintComponent.

...