2015-11-04 47 views
0

我创建了一个Swing接口,当光标悬停在按钮上时,我想让一个图标出现在JLabel中。该图标将根据光标悬停在哪个按钮上而更改。根据光标悬停在哪个按钮来更改JLabel中的图像?

这里是编码我使用的那一刻:

public void iconchange() 
    { 
     if(btnPlay.isRolloverEnabled() == true) 
     { 
      lblIcon.setIcon(new ImageIcon("Images/Play-icon.png")); 
     } 
    } 

我知道上面的编码是错误的,所以我能做些什么来实现我上面提到的功能?

+0

注:无需要提到你的IDE,因为这是使用Java完成的,而不是IDE。 –

回答

2

使用ChangeListener该模型,例如...

public class ChangeHandler implements ChangeListener { 

    private JLabel label; 
    private Icon armedIcon; 

    public ChangeHandler(JLabel label, Icon armedIcon) { 
     this.armedIcon = armedIcon; 
     this.label = label; 
    } 

    @Override 
    public void stateChanged(ChangeEvent e) { 
     ButtonModel model = (ButtonModel) e.getSource(); 
     if (model.isRollover()) { 
      label.setIcon(armedIcon); 
     } else { 
      label.setIcon(null); 
     } 
    } 

} 

这将更新提供JLabel,改变它的icon到指定iconButtonModel它附着在rollOver状态

这可以用于这样的事情...

Rollover

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ButtonModel; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class RollOver { 

    public static void main(String[] args) { 
     new RollOver(); 
    } 

    public RollOver() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel label; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      // I'm doing this, because I don't have blank icon of 128x128 and my 
      // icons are both 128x128 
      label = new JLabel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(128, 128); 
       } 
      }; 
      add(label, gbc); 
      try { 
       JButton btn = new JButton("Bunnies"); 
       btn.getModel().addChangeListener(new ChangeHandler(label, new ImageIcon(ImageIO.read(getClass().getResource("/Bunny.png"))))); 
       add(btn); 
       btn = new JButton("Zomnies"); 
       btn.getModel().addChangeListener(new ChangeHandler(label, new ImageIcon(ImageIO.read(getClass().getResource("/Zombi.png"))))); 
       add(btn); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 

     public class ChangeHandler implements ChangeListener { 

      private JLabel label; 
      private Icon armedIcon; 

      public ChangeHandler(JLabel label, Icon armedIcon) { 
       this.armedIcon = armedIcon; 
       this.label = label; 
      } 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       ButtonModel model = (ButtonModel) e.getSource(); 
       if (model.isRollover()) { 
        label.setIcon(armedIcon); 
       } else { 
        label.setIcon(null); 
       } 
      } 

     } 

    } 

} 

再仔细看看How to Use Buttons, Check Boxes, and Radio Buttons更多细节

+0

这可以用Swing GUI实现吗?当我输入你提供的编码时,许多行被强调为错误?我已经有一个使用拖放的按钮,名为btnPlay。有没有其他方式来实现这一点?你添加到你的答案的GIF大致做了我想要做的事情 – Osiris93

+0

*“这可以用Swing GUI实现吗?”* - 整个例子都是Swing GUI。不要将表单设计器与API混淆,表单设计器只是一个工具。 *“我已经有一个使用拖放的按钮,名为btnPlay。是否没有其他方法来实现这一点?” - 是的,你将提出的概念应用到你的代码中。 ''btn.getModel()。addChangeListener''就是你开始使用代码所需要的(和'ChangeListener'实现) – MadProgrammer

+0

表单设计器只能做很多事情,在某些时候,你需要得到你的手脏了一些代码,越快越好。表单设计师是拐杖,你可以不用 – MadProgrammer

2

添加的MouseListener到btnPlay,并用鼠标退出和进入方式上JButtonButtonModel监视更改模型状态,更新基于状态的UI

btnPlay.addMouseListener(new java.awt.event.MouseAdapter() { 
    public void mouseEntered(java.awt.event.MouseEvent evt) { 
     lblIcon.setIcon(new ImageIcon("Images/Play-icon.png")); 
    } 

    public void mouseExited(java.awt.event.MouseEvent evt) { 
     //I assume you want to remove or change the icon afterward 
    } 
}); 
+0

这可以用Swing GUI实现吗?当我输入你提供的编码时,许多行被强调为错误?我已经有一个使用拖放的按钮,名为btnPlay。有没有其他方式来实现这一点? – Osiris93

+0

请阅读MadProgrammer的评论 –