2013-09-02 4 views
4

Я пытаюсь отобразить JButton с изображением на нем, но я не могу понять, как заставить Mousehover работать над этим. Нормальное отображение изображения работает, жестко. Также было бы неплохо, если бы текст, нарисованный на кнопке, мог быть центрирован.JButton с фоном Изменение изображения на мыши наведите указатель мыши

import java.awt.*; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class ImageButtonTest { 

    private static JButton imageButton; 

    public static void main(String[] args) throws IOException { 
     JFrame frm = new JFrame(); 
     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frm.setSize(90, 27); 
     frm.setLocation(50, 50); 
     Image image = ImageIO.read(new URL("http://i.imgur.com/bitgM6l.png")); 
     Image imageHover = ImageIO.read(new URL("http://i.imgur.com/dt81BWk.png")); 
     imageButton = new ImageButton(image, imageHover); 
     imageButton.setText("Download"); 
     frm.add(imageButton); 
     frm.pack(); 
     frm.setVisible(true); 
    } 

    static class ImageButton extends JButton { 
     private Image image, imageHover; 
     private boolean hover; 

     ImageButton(Image image, Image imageHover) { 
      this.image = image; 
      this.hover = false; 


      addMouseListener(new java.awt.event.MouseAdapter() { 
       @Override 
       public void mouseEntered(java.awt.event.MouseEvent evt) { 
        hover = true; 
        repaint(); 
       } 

       @Override 
       public void mouseExited(java.awt.event.MouseEvent evt) { 
        hover = false; 
        repaint(); 
       } 
      }); 
     }; 

     @Override 
     protected void paintComponent(Graphics g) { 

      if(isEnabled()) { 
       Graphics2D g2 = (Graphics2D) g.create(); 
       g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
       g2.setFont(new Font("Arial", Font.PLAIN, 12)); 
       g2.setColor(Color.WHITE); 

       if(hover) { 
        g2.drawImage(imageHover, 0, 0, getWidth(), getHeight(), this); 
       } else { 
        g2.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
       } 
       g2.drawString(getText(), 20, getHeight()/2 + 5); 

       g2.dispose(); 
      } else { 
       super.paintComponent(g); 
      } 

     } 

    } 

} 
+2

Использование [ 'setRolloverIcon (Icon)'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#setRolloverIcon%28javax.swing.Icon%29). Есть также метод для отключения значка, нажмите значок. См. Документы. –

+1

Возможный дубликат [как изменить изображение значка кнопки на введенной мыши и выход мыши в java] (http://stackoverflow.com/questions/11536200/how-to-change-icon-image-of-button-on- mouse-in-and-mouse-exit-in-java) или [этот] (http://stackoverflow.com/a/12875475/418556) или [этот] (http://stackoverflow.com/a/ 17296454/418556). –

ответ

5

Изображение Изображение = ImageIO.read (новый URL-адрес ("http://i.imgur.com/bitgM6l.png")); Image imageHover = ImageIO.read (новый URL ("http://i.imgur.com/dt81BWk.png"));

вы можете использовать стандартные методы, реализованные в

JButton API

//button.setBorderPainted(false); 
//button.setBorder(null); 
//button.setFocusable(false); 
//button.setMargin(new Insets(0, 0, 0, 0)); 
button.setContentAreaFilled(false); 
button.setIcon(icon()); 
button.setRolloverIcon(iconA()); 
button.setPressedIcon(iconB()); 
button.setDisabledIcon(iconC()); 

JButton.getModel(). AddChangeListener()

JButton.getModel().addChangeListener(new ChangeListener() { 
     @Override 
     public void stateChanged(ChangeEvent e) { 
      ButtonModel model = (ButtonModel) e.getSource(); 
      if (model.isRollover()) { 
       button.setIcon(icon()); 
      } else { 
       button.setIcon(iconA()); 
      } etc ...// if (model.isPressed()) { 
     } 
    }); 
+0

Мне нужен фон, который нужно повторить на оси X. Это возможно? – Marius

+0

положить значки в очередь, не знаю, что «фон повторяется на оси X» – mKorbel

+0

Мне нужна иконка, чтобы повторить/растянуть на моей кнопке. Должен ли я редактировать значок перед его применением? – Marius

Смежные вопросы