2013-01-16 2 views
6

나는 봤지만 정답을 찾을 수 없었다. JPanel이 있는데 위에서 아래로 그라데이션을 갖기를 원합니다. 두 색상 만 사용하려고합니다. 이것을 어떻게 할 수 있습니까?JPanel 그래디언트 배경

+0

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

+5

"스윙 jpanel 배경 색상 그라디언트"에 대한 인터넷 검색 및이 첫 번째 링크입니다 : http://www.javarichclient.com/how-to-add-a-gradient-background-to-any-jcomponent/정보를 가지고있는 것 같아 –

답변

6

당신이가는 :

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

좋은 예가 있는데, Id는'setPize (..) '를 호출하는 대신'JPanel'의'getPreferredSize()'를 오버라이드하고'JFrame'에'pack()'을 호출 할 것을 제안하지만 –

+0

@DavidKroukamp'setSize()'호출 화면 상에 무엇인가를 보여주기위한 것입니다. 이 경우, getPreferredSize()를 오버라이드 (override)하고는 싶지 않습니다. Panel가 실제로 LayoutManager를 설정해 컴퍼넌트를 추가하기 위해서 (때문에) 나중에 사용되기 (위해) 때문에, getPreferredSize()는 그 LayoutManager에 의해 계산됩니다. 임의의 크기가 아닙니다. 어쨌든, 이것은 단순한 질책 일 뿐이며 두 가지 해결책 모두 똑같이 받아 들일 수 있다고 생각합니다. –

+0

개인적으로 LinearGradientPaint를 선호하지만 필요에 따라 달라집니다.) – MadProgrammer

4

헤이 Bebbie이 사용할 수 있습니다

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()); 

     } 

    }; 

희망 도움이; 할 수도 있습니다 다시 더 많은 도움이 artical에 : 여기 Gradient background to any jcomponent

+0

나는 이것에 BS를 부른다. 당신이 근원에 연결하기에 충분할만큼 정직하다는 것은 좋은 일입니다. 그러나 소스가 정확하고 잘못된 방법으로 수정했습니다. 힌트 :'JComponent.setOpaque (false);'는 핵심 요소이며'super.paintComponent (grphcs);'는 마지막 호출이되어야합니다. 그렇지 않은 경우, 코드는 모든'JComponent' 객체로는 동작하지 않습니다. 또, 향후의 변경에 관해서는 강력하지는 않습니다. 하지만 포인터 주셔서 감사합니다. –

관련 문제