2011-08-19 138 views

Respuesta

18

Usted puede anular el método de la JButton ejemplo paintComponent y pintar su objeto Graphics con una de las siguientes clases que implementan la interfaz Paint:


import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public final class JGradientButtonDemo { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI();   
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     final JFrame frame = new JFrame("Gradient JButton Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new FlowLayout()); 
     frame.add(JGradientButton.newInstance()); 
     frame.setSize(new Dimension(300, 150)); // used for demonstration 
     //frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static class JGradientButton extends JButton { 
     private JGradientButton() { 
      super("Gradient Button"); 
      setContentAreaFilled(false); 
      setFocusPainted(false); // used for demonstration 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      final Graphics2D g2 = (Graphics2D) g.create(); 
      g2.setPaint(new GradientPaint(
        new Point(0, 0), 
        Color.WHITE, 
        new Point(0, getHeight()), 
        Color.PINK.darker())); 
      g2.fillRect(0, 0, getWidth(), getHeight()); 
      g2.dispose(); 

      super.paintComponent(g); 
     } 

     public static JGradientButton newInstance() { 
      return new JGradientButton(); 
     } 
    } 
} 

enter image description here

+1

ya que debe ser L & F sensible, pero vey agradable 1 – mKorbel

+1

mejor solución que he encontrado en SO –

5

Una pequeña mejora con respecto a MRE respuesta:

enter image description here

private static final class JGradientButton extends JButton{ 
    private JGradientButton(String text){ 
     super(text); 
     setContentAreaFilled(false); 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     Graphics2D g2 = (Graphics2D)g.create(); 
     g2.setPaint(new GradientPaint(
       new Point(0, 0), 
       getBackground(), 
       new Point(0, getHeight()/3), 
       Color.WHITE)); 
     g2.fillRect(0, 0, getWidth(), getHeight()/3); 
     g2.setPaint(new GradientPaint(
       new Point(0, getHeight()/3), 
       Color.WHITE, 
       new Point(0, getHeight()), 
       getBackground())); 
     g2.fillRect(0, getHeight()/3, getWidth(), getHeight()); 
     g2.dispose(); 

     super.paintComponent(g); 
    } 
} 
+0

¿Cómo se podría aplicar a un botón que ya es parte de una interfaz gráfica de usuario? ¿Tendría que cambiar los oyentes de acción si agregara esto a los botones? ¿Es eso posible? O mejor pregunta; ¿Es una pregunta razonable preguntar en primer lugar? –

+0

Si una GUI ya tiene un botón, debe haber algún código que cree ese botón (JButton b = new JButton ("whatever")). Para reemplazar el botón predeterminado, debe crear un JGradientButton en su lugar (JButton b = new JGradientButton ("whatever")) y establecer el color de fondo a su gusto (b.setBackground (.. somecolor ...)). El código restante en la GUI que maneja el botón no debe modificarse – luca

Cuestiones relacionadas