2013-06-24 7 views
5

Ho un JFrame su cui sto mettendo diversi JButtons. La metà dei JButtons ha una codifica a colori, ad es. Li giro di blu quando succede l'evento X - e uso btn.setBackgroundColor (Color). Quando uso setBackgroundColor, posso vedere che ho l'aspetto di quelli normali I JButtons hanno ombreggiature/colori/qualcosa che quelli con il setBackgroundColor non hanno. Ho provato a rendere il colore trasparente in misura limitata, ma ho ancora un blocco di colore piatto, piuttosto che una versione colorata del pulsante ombreggiato.Come faccio a rendere i JButton tutti uguali quando si cambia il colore di sfondo su alcuni di essi e non su altri?

Sembra che dovrebbe essere una cosa piuttosto semplice da risolvere, ma mi sta disturbando in questo momento. Non voglio cambiare il LAF predefinito: va bene. Non voglio abbandonare il viraggio. Voglio che i pulsanti appaiano tutti in stile (la parola che userei per HTML).

Quindi mi manca qualcosa proprio qui .... che cos'è?

A cura di aggiungere:

JFrame frame = new JFrame(); 
frame.add(new JButton("42")); 
JButton btn24 = new JButton("24"); 
btn24.setBackground(Color.red); 
frame.add(btn24); 
frame.setVisible(true); 

Nell'esempio di cui sopra, "42" sarà - sulla mia macchina Windows - mostrare una leggera variazione di colore nella parte inferiore e la parte superiore, creando un effetto arrotondato e ombreggiato . Il pulsante "24" mostrerà un quadrato rosso. La mia domanda è: c'è un modo per far apparire "24" arrotondato/ombreggiato/stilizzato con la tinta rossa in cima? O devo semplicemente fare tutti i miei pulsanti quadrati per un aspetto uniforme?

Grazie!

+1

Posta il codice che hai già provato e forse un'immagine di cosa intendi per "ombreggiatura"/colorazione/qualcosa che quelli con setBackgroundColor non " –

+2

Guarda la risposta di @ mKorbel [qui] (http://stackoverflow.com/questions/5751311/creating-a-custom-button-in-java-with-jbutton/5755124 # 5755124). E poi su-votare la sua risposta, perché è davvero sorprendente. Guarda anche la risposta di camickr [qui] (http://stackoverflow.com/questions/6256483/how-to-set-the-button-color-of-a-jbutton-not-background-color?rq=1). –

+0

Sto guardando la risposta di @ mKorbel. il codice di prova di camickr ha mostrato più o meno le stesse cose che stavo vedendo con setBackgroundColor con Windows e Java 7. – user2363027

risposta

2

Creare un costume JButton e sovrascrivere il metodo paint come illustrato sotto:

import static javax.swing.JFrame.EXIT_ON_CLOSE; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String[] args) { 
    JButton btn24 = new DepthButton("24"); 
    JButton btn25 = new DepthButton("25"); 
    btn24.setBackground(Color.red); 
    btn25.setBackground(Color.GREEN); 

    JPanel pane = new JPanel(new BorderLayout()); 
    pane.add(new JButton("42"), BorderLayout.PAGE_START); 

    pane.add(btn24, BorderLayout.PAGE_END); 
    pane.add(btn25, BorderLayout.CENTER); 

    frame.add(pane); 
    frame.pack(); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

    /** 
    * 
    * @author Romain Guy 
    */ 
    public static class DepthButton extends JButton { 

     /** Creates a new instance of DepthButton */ 
     public DepthButton(String text) { 
      super(text); 
      setContentAreaFilled(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      Graphics2D g2 = (Graphics2D) g; 

      GradientPaint p; 
      p = new GradientPaint(0, 0, new Color(0xFFFFFF), 0, getHeight(), getBackground()); 

      Paint oldPaint = g2.getPaint(); 
      g2.setPaint(p); 
      g2.fillRect(0, 0, getWidth(), getHeight()); 
      g2.setPaint(oldPaint); 

      super.paintComponent(g); 
     } 
    } 
} 

Ed ecco il risultato: enter image description here

L'esempio è da un ottimo libro per avanzati Java Swing: Filthy Rich Clients https://github.com/romainguy/filthy-rich-clients/blob/master/Gradients/TwoStopsGradient/src/DepthButton.java

+1

L'ho provato e sembra che funzioni sulla mia macchina Windows.Ho usato getBackground invece di new Color (0xC8D2DE) –

+1

@SergejWerfel nice edit :) – firephil

Problemi correlati