【问题标题】:Darken JButton(s) on hover/click悬停/单击时使 JButton 变暗
【发布时间】:2012-04-24 19:51:28
【问题描述】:
ImageIcon backpackImageIcon = new ImageIcon("images/gui/button_backpack.png");
JButton backpackButton = new JButton();
backpackButton.setBounds(660,686,33,33);
backpackButton.setBorderPainted(false);
backpackButton.setFocusPainted(false);
backpackButton.setVisible(true);
backpackButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("B"), "backpackButtonPress");
backpackButton.getActionMap().put("backpackButtonPress", ClassBackpackButton);
backpackButton.setAction(ClassBackpackButton);
backpackButton.setIcon(backpackImageIcon);
backpackButton.setToolTipText("Backpack[B]");
panel.add(backpackButton);      

我有多个按钮以这种方式设置。我希望能够做的是让它们在悬停时变暗 10%,在点击时可能变暗 20%。我试图四处寻找如何做到这一点,但没有运气(只找到了 javascript 的东西)。抱歉,如果之前有人问过这个问题,感谢您的帮助。

** 编辑 **

我尝试过这样做,但它只是将图像变为空白:

BufferedImage bufferedImage = null;
try {
    bufferedImage = ImageIO.read(new File("images/gui/button_backpack.png"));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
BufferedImage darkerBackpackBufferedImage = new BufferedImage(32, 32, BufferedImage.TYPE_BYTE_INDEXED);
RescaleOp op = new RescaleOp(1.3f, 0, null);
darkerBackpackBufferedImage = op.filter(bufferedImage, null);
ImageIcon darkerBackpackImageIcon = new ImageIcon((Image) darkerBackpackBufferedImage);
backpackButton.setRolloverIcon((ImageIcon) darkerBackpackImageIcon);

** 编辑 ** 带解决方案

这是我为阅读以上内容的任何人使用的修改后的 shiftColor 函数...祝你好运:)

public BufferedImage shiftColor(BufferedImage img, int rShift, int gShift, int bShift) {
    Color tmpCol;
    int tmpRed, tmpGreen, tmpBlue;
    for (int x = 0; x < img.getWidth(); x++) {
        for (int y = 0; y < img.getHeight(); y++) {
            tmpCol=new Color(img.getRGB(x,y));
            tmpRed = (tmpCol.getRed()-rShift < 0) ? 0 : tmpCol.getRed()-rShift; //if shifted color is less than 0 change to 0
            tmpGreen = (tmpCol.getGreen()-gShift < 0) ? 0 : tmpCol.getGreen()-gShift; //if shifted color is less than 0 change to 0
            tmpBlue = (tmpCol.getBlue()-bShift < 0) ? 0 : tmpCol.getBlue()-bShift; //if shifted color is less than 0 change to 0
            tmpCol=new Color(tmpRed, tmpGreen, tmpBlue);
            img.setRGB(x,y,tmpCol.getRGB());
        }
    }
    return img;
}

【问题讨论】:

    标签: java swing mouseover jbutton imageicon


    【解决方案1】:

    有两种方法

    1) 使用built-in methods in JButtons API

    button.setIcon((Icon i));
    button.setRolloverIcon((Icon i));
    button.setPressedIcon(Icon i));
    button.setDisabledIcon(Icon i));
    

    2) 使用ButtonModel

    【讨论】:

    • +1 使用RescaleOp,图示here,为每次使用更改一个Icon
    【解决方案2】:

    此函数将返回一个带有颜色偏移(即较亮/较暗)的 BufferedImage

    public BufferedImage shiftColor(BufferedImage img, int rShift, int gShift,int bShift) {
        Color tmpCol;
        for (int x = 0; x < img.getWidth(); x++) {
            for (int y = 0; y < img.getHeight(); y++) {
                tmpCol=new Color(img.getRGB(x,y));
                tmpCol=new Color(tmpCol.getRed()-rShift,tmpCol.getGreen()-gShift,tmpCol.getBlue()-bShift);
                img.setRGB(x,y,tmpCol.getRGB());
            }
        }
        return img;
    }
    

    即使这样可行,我仍然建议在图像编辑器(即 Photoshop)中同时创建明暗图像并在启动时加载它们。上面的代码将是进程密集型的,并且会减慢您的应用运行时间。

    【讨论】:

    • tmpCol=new Color(img.getRGB()); BufferedImage类型中的getRGB(int, int)方法不适用于参数()
    • 很确定它应该是 getRGB(x, y);根本不想成为痛苦,我真的很感激帮助,只是想纠正任何发现这篇文章的人
    • 改为使用RescaleOp,图示为here
    【解决方案3】:

    看看这个tutorial。您可能对 mouseEntered 感兴趣。由于不是在 Java 中更改背包的颜色,而是考虑 2 个图像,一个是浅色背包,另一个是深色背包。将鼠标悬停在按钮上时更改它们。

    public class MouseEventDemo implements MouseListener {
        ImageIcon backpackImageIcon = new ImageIcon("images/gui/button_backpack.png");
        JButton backpackButton = new JButton();
        backpackButton.setBounds(660,686,33,33);
        backpackButton.setBorderPainted(false);
        backpackButton.setFocusPainted(false);
        backpackButton.setVisible(true);
        backpackButton.addMouseListener(this);
        addMouseListener(this);
    
        backpackButton.setIcon(backpackImageIcon);
        backpackButton.setToolTipText("Backpack[B]");
        panel.add(backpackButton);  
    
        public void mousePressed(MouseEvent e) {}
    
        public void mouseReleased(MouseEvent e) {}
    
        public void mouseEntered(MouseEvent e) {
           //set button color to dark color
        }
        public void mouseExited(MouseEvent e) {
           //set button color to light color
        }
        public void mouseClicked(MouseEvent e) {}
    
    }
    

    【讨论】:

    • 我可以使用 setRolloverIcon() 但需要帮助使图像变暗
    • @JayAvon:那么为什么不制作较暗的图像,将它们放在 ImageIcons 中,然后将它们设置为您的翻转图像呢?对此进行投票以取消您的反对票。
    • 因为我不想打开 PhotoShop 中的每个按钮,然后将它们变暗 10% 和 20%,然后改变主意,不得不重新做一遍。我想为我编写代码,所以如果我以后改变主意,我可以输入一个新的 XX%。有没有办法使 ImageIcon 变暗??
    • @JayAvon op.filter(bufferedImage, bufferedImage); 不是 op.filter(bufferedImage, null); 并在应用程序启动时准备所有图标,作为局部变量创建一次,而不是在运行中
    • @JayAvon:谁说过关于 PhotoShop 的事?这一切都可以在 Java 中完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2014-01-28
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多