单击时如何更改JButton上的图像?

时间:2014-05-18 02:20:44

标签: java swing jbutton

    JButton lunarButton = new JButton(new ImageIcon("assets/Buttons/moon.png"));
    lunarButton.setActionCommand("switch");
    c.gridwidth=1;
    c.gridy = 0;
    searchArea.add(lunarButton, c);

public void actionPerformed(ActionEvent ev)
{
    int count = 1;
    String action = ev.getActionCommand();

    if("switch".equals(action))
    {           
        ImageIcon sun = new ImageIcon("assets/sun.png");
        ImageIcon moon = new ImageIcon("assets/moon.png");

        changeLunar();
        count++;
        if (count % 2 == 0)
        {
             lunarButton.setIcon(sun);
        }
        else
        {
             lunarButton.setIcon(moon);
        }

我实现了这个代码,但是eclipse告诉我" lunarButton无法解析",它是否无法在我的init()方法中看到lunarButton变量?我在这里错过了什么?

1 个答案:

答案 0 :(得分:3)

您的lunarButton可以在本地声明,也许在init方法中声明。

一种解决方案:将其声明为类中的实例字段,而不是init方法。

解决方案二:不要担心变量。从ActionEvent参数的getSource()方法中获取JButton 对象 。将返回的对象转换为JButton,并调用您喜欢的任何方法。

例如:

if("switch".equals(action))
{           
    // ImageIcon sun = new ImageIcon("assets/sun.png");
    // ImageIcon moon = new ImageIcon("assets/moon.png");

    JButton btn = (JButton) ae.getSource();

    changeLunar();
    count++;
    if (count % 2 == 0)
    {
         btn.setIcon(sun);
    }
    else
    {
         btn.setIcon(moon);
    }

顺便说一句:每次按下按钮时,您都不想从磁盘重新加载图像。而是在 一次 中读取图像,可能在构造函数中,将它们填充到ImageIcon字段中,并在需要时使用该字段。