簡體   English   中英

JButton圖標透明制品

[英]JButton icon transparent artefacts

有人可能會認為我正在發表雙重看法,因為我已經在這里問過這個問題: JButton alpha背景隨鼠標懸停而變化

但是我有一些問題,不是與使用透明色的Alpha背景按鈕有關,而是與使用透明圖標(.png)的按鈕有關。 我已經嘗試了很多東西,但是我仍然有人工制品,我真的不明白為什么。

這是我的代碼:

 public class PanelPosition extends JPanel
{
    private JButton leftArrow, rightArrow;

    public PanelPosition (int width, int height)
    {
        this.setPreferredSize(new Dimension(width,height));
        this.setBackground(new Color(0,0,0,0));

        JLabel position = new JLabel("support", JLabel.CENTER);
        position.setForeground(Color.white);

        leftArrow = new JButton(new AlphaImageIcon(new ImageIcon("pictures\\left arrow.png"),1));
        rightArrow = new JButton(new AlphaImageIcon(new ImageIcon("pictures\\right arrow.png"),1));

        leftArrow.setBackground(new Color (0,0,0,0));
        rightArrow.setBackground(new Color (0,0,0,0));

        leftArrow.setPreferredSize(new Dimension(leftArrow.getIcon().getIconWidth(), leftArrow.getIcon().getIconHeight()));
        rightArrow.setPreferredSize(new Dimension(rightArrow.getIcon().getIconWidth(), rightArrow.getIcon().getIconHeight()));

        leftArrow.setOpaque(false);
        leftArrow.setFocusPainted(false);
        leftArrow.setBorderPainted(false);
        leftArrow.setContentAreaFilled(false);
        leftArrow.addMouseListener(new MouseAdapter()
        {
             @Override
            public void mouseEntered(MouseEvent evt)
            {
                leftArrow.setIcon(new AlphaImageIcon(new ImageIcon("pictures\\left arrow.png"), (float)0.7));
            }
            @Override
            public void mouseExited(MouseEvent evt)
            {
               leftArrow.setIcon(new AlphaImageIcon(new ImageIcon("pictures\\left arrow.png"), (float)0.3));
            }
        });

        rightArrow.setOpaque(false);
        rightArrow.setFocusPainted(false);
        rightArrow.setBorderPainted(false);
        rightArrow.setContentAreaFilled(false);
        rightArrow.addMouseListener(new MouseAdapter()
        {
             @Override
            public void mouseEntered(MouseEvent evt)
            {
                rightArrow.setIcon(new AlphaImageIcon(new ImageIcon("pictures\\right arrow.png"), (float)0.7));
            }
            @Override
            public void mouseExited(MouseEvent evt)
            {
               rightArrow.setIcon(new AlphaImageIcon(new ImageIcon("pictures\\right arrow.png"), (float)0.3));
            }
        });

        add(leftArrow);
        add(position);
        add(rightArrow);

    }

}

對於那些AlphaImageIcon提出問題的人,我在這里找到了這個類,我就簡單地接受它: https : //github.com/griffon/griffon-javatips-plugin/blob/master/src/main/com/wordpress/tipsforjava/ swing / AlphaImageIcon.java

感謝您的幫助,對不起。

有些人可能會認為我正在發表雙重看法

是的,問題略有不同,但問題相同。

但我有一些問題,與使用透明色的Alpha背景按鈕無關,而與使用透明圖標的按鈕有關

是的,問題仍然出在Alpha背景上。 您正在面板上使用Alpha背景:

this.setBackground(new Color(0,0,0,0));

將該面板添加到框架中時,請擺脫上述聲明或使用AlphaContainer

leftArrow.setBackground(new Color (0,0,0,0));
rightArrow.setBackground(new Color (0,0,0,0));

另外,擺脫上面的兩個語句,因為它們在以后使用時不起作用:

leftArrow.setOpaque(false);
rightArrow.setOpaque(false);

這意味着不要繪制背景。 因此,將背景塗成任何顏色都不會起作用。 重讀我的答案,並按照您上一個問題的博客鏈接!

同樣,我博客鏈接中的摘要是,只要您在我建議的兩種解決方案之一(可能還有其他)中使用,則在任何組件上使用alpha時,都會出現繪畫問題。

同樣,不確定為什么您的按鈕有3種狀態。 一旦將鼠標移到按鈕上,它將永遠不會回到完全不透明的狀態。 如果您只是想產生過渡效果,則可能應該使用:

leftArrow.setRolloverIcon(...);

而不是嘗試自己管理MouseListener。 然后,您將有兩個狀態,一個為過渡狀態,另一個為默認狀態。 使用這種方法,您還將只讀取一次圖標,而不是每次鼠標進入/退出按鈕時都讀取一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM