2011-08-19 9 views

risposta

18

È può sovrascrivere il metodo dell'istanza JButtonpaintComponent e vernice sua Graphics oggetto con una delle seguenti classi che implementano l'interfaccia 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

poiché dovrebbe essere L & F sensibile, ma vey piacevole +1 – mKorbel

+1

migliore soluzione che ho trovato su SO –

5

Un piccolo miglioramento nel corso MRE risposta:

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

Come sarebbe uno implementare questo a un pulsante che fa già parte di una GUI? Dovrei cambiare gli ascoltatori di azioni se aggiungo questo ai pulsanti? È possibile? O meglio una domanda; è una domanda ragionevole da chiedere in primo luogo? –

+0

Se una GUI ha già un pulsante, ci deve essere del codice che crea quel pulsante (JButton b = new JButton ("qualunque cosa")). Per sostituire il pulsante predefinito, devi invece creare un JGradientButton (JButton b = new JGradientButton ("Whatever")) e impostare il colore di sfondo su ciò che ti piace (b.setBackground (.. somecolor ...)). Il codice rimanente nella GUI che gestisce il pulsante dovrebbe essere lasciato invariato – luca

Problemi correlati