2

JPopupMenu

Border背景とを削除する必要がありJPopupMenuます。JPopupMenu完全に透明である必要があります。をオーバーライドしpaintComponentても、良い結果は得られません。BasicMenuItemUI/PopupMenuUIMenuItemUI/でも解決策を見つけようとし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);
4

1 に答える 1

6

デリゲートのプロパティは変更できますがPopupMenuUI、選択したルック アンド フィールが変更を反映するという保証はありません。変更は、GUI コンポーネントがインスタンス化される前に、プログラムの早い段階で行う必要があります。

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

補遺: @MadProgrammer がコメントしたように、プラットフォームのピア コンポーネントは不透明で、制御できない可能性があります。あなたのコード ( MenuTest, CustomPopupMenuUI, CustomMenuItemUI) は に以下のように表示されますcom.apple.laf.AquaLookAndFeel。より良い解決策がない場合は、ここに示すように、独自の半透明ウィンドウを実装することを検討してください。

画像

于 2012-09-19T17:28:42.977 に答える