2013-01-16 9 views
6

Przeszukałem go, ale nie znalazłem prawidłowej odpowiedzi. Mam JPanel i chcę mieć gradient, który pochodzi od góry do dołu. Po prostu użyję dwóch kolorów. Jak mogę to osiągnąć?JPanel gradientowe tło

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/ awt/GradientPaint.html – MikeTheLiar

+5

I Googled dla "swing jpanel gradient koloru tła" i jest to pierwsze łącze: http://www.javarichclient.com/how-to-add-a-gradient-background-to-any-jcomponent/Wygląda na to, że mam informację o tym, –

Odpowiedz

6

Proszę bardzo:

import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestPanel extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     int w = getWidth(); 
     int h = getHeight(); 
     Color color1 = Color.RED; 
     Color color2 = Color.GREEN; 
     GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2); 
     g2d.setPaint(gp); 
     g2d.fillRect(0, 0, w, h); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       TestPanel panel = new TestPanel(); 
       frame.add(panel); 
       frame.setSize(200, 200); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+ 1 przykład, chociaż Id sugeruje nadpisanie 'getPreferredSize()' 'JPanel' i wywołanie' pack() 'na' JFrame' zamiast wywoływania 'setSize (..)' –

+0

@DavidKroukamp wywołania 'setSize()' ma mieć coś widocznego na ekranie. Nie chcę w tym przypadku przesłonić 'getPreferredSize()', ponieważ rozumiem, że Panel będzie później faktycznie używany do ustawiania LayoutManagera i dodawania komponentów, dlatego też 'getPreferredSize()' powinien być obliczany przez ten LayoutManager i nie arbitralny rozmiar. Tak czy inaczej, to jest po prostu szarpanie i uważam, że oba rozwiązania są do przyjęcia w równym stopniu. –

+0

Ja osobiście preferuję LinearGradientPaint osobiście, ale to zależy od potrzeb;) – MadProgrammer

4

hej Bebbie można użyć to:

JPanel contentPane = new JPanel() { 
     @Override 
     protected void paintComponent(Graphics grphcs) { 
      super.paintComponent(grphcs); 
      Graphics2D g2d = (Graphics2D) grphcs; 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      GradientPaint gp = new GradientPaint(0, 0, 
        getBackground().brighter().brighter(), 0, getHeight(), 
        getBackground().darker().darker()); 
      g2d.setPaint(gp); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 

     } 

    }; 

nadzieja, że ​​pomoc; można również powrót do tego artical Aby uzyskać więcej pomocy: Gradient background to any jcomponent

+0

. Dobrze, że jesteś na tyle uczciwy, by połączyć się ze źródłem. Jednak źródło ma to poprawne i zmodyfikowałeś go w niewłaściwy sposób. Podpowiedź: 'JComponent.setOpaque (fałsz);' jest kluczowym czynnikiem i 'super.paintComponent (grphcs);' musi być ostatnim wywołaniem. W przeciwnym razie twój kod nie będzie działał ze wszystkimi obiektami "JComponent", a także nie będzie odporny na jakiekolwiek przyszłe zmiany. Ale dzięki za wskazówkę. –