2015-11-04 46 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的評論 –