JPopupMenu удалить фон и границу

http://s010.radikal.ru/i313/1209/25/2213e2145879.gif

Мне нужно удалить фон и Border в JPopupMenu, JPopupMenu должен быть полностью прозрачным. Переопределение paintComponent не дает положительного результата. Я также пытался найти решение в BasicMenuItemUI/PopupMenuUI а также MenuItemUI/BasicPopupMenuUI но обнаружил, что фон рендеринга и границы не в них.

public class CustomMenuItemUI extends BasicMenuItemUI {
    protected MouseInputListener mouseInputListener;
    protected MenuDragMouseListener menuDragMouseListener;
    public static ComponentUI createUI(JComponent c) {
        return new CustomMenuItemUI();
    }

    private static float alpha = 0.0f;
    private static float selectionAlpha = 0.0f;

    public static float getAlpha() {
        return alpha;
    }

    public static void setAlpha(float _alpha) {
        alpha = _alpha;
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        menuItem.setOpaque(false);
    }

    @Override
    public void paint(Graphics g, JComponent comp) {
        Graphics2D gx = (Graphics2D) g.create();
        gx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        super.paint(gx, comp);
        gx.dispose();
    }

    @Override
    protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) {
        ButtonModel model = menuItem.getModel();
        Color oldColor = Color.red;
        int menuWidth = menuItem.getWidth();
        int menuHeight = menuItem.getHeight();
        if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) {
            Graphics2D g2 = (Graphics2D) g.create(); 
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, selectionAlpha));
            g2.setColor(Color.red);
            g2.fillRect(0, 0, menuWidth, menuHeight);
        } else {
            g.setColor(Color.red);
            g.fillRect(0, 0, menuWidth, menuHeight);
        }
        g.setColor(oldColor);
    }

    @Override
    protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) {
        ButtonModel model = menuItem.getModel();
        if (model.isArmed() || model.isSelected() || !model.isSelected()) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
            super.paintText(g2, menuItem, textRect, text);
            g2.dispose();
        } else {
            super.paintText(g, menuItem, textRect, text);
        }
    }
    public static void setSelectionAlpha(float alpha) {
        selectionAlpha  = alpha;
    }
}

    String poppUI = CustomPopupMenuUI.class.getName(); 
UIManager.put("PopupMenuUI", poppUI);

1 ответ

Решение

Вы можете изменить PopupMenuUI делегировать свойства, хотя нет никакой гарантии, что выбранный вами Look & Feel примет изменения. изменение должно быть в начале программы, прежде чем будет создан какой-либо компонент GUI.

UIManager.put("PopupMenu.background", new Color(0));
UIManager.put("PopupMenu.border", BorderFactory.createEmptyBorder());

Приложение: Как прокомментировал @MadProgrammer, одноранговый компонент платформы может быть непрозрачным и находиться вне вашего контроля. Ваш код (MenuTest, CustomPopupMenuUI, CustomMenuItemUI) имеет вид, показанный ниже на com.apple.laf.AquaLookAndFeel, Если нет лучшего решения, вы можете посмотреть на реализацию собственного полупрозрачного окна, как показано здесь.

образ

Другие вопросы по тегам