Java: Как добавить прозрачный градиентный фон в JFrame - PullRequest
1 голос
/ 20 июля 2011

Java: я хочу использовать прозрачный фон в стиле градиента для JFrame.В верхней части прозрачность должна составлять 100%, но при понижении она должна уменьшаться, а в нижней части она должна составлять 20%

Я знаю, что могу использовать изображения, уже имеющие такой эффект, но я хочу предоставитьсредство тем и позволяет пользователю использовать свои любимые изображения, но обеспечивает прозрачность во время выполнения.

Ответы [ 3 ]

5 голосов
/ 20 июля 2011

В Sun добавлена ​​поддержка полупрозрачного фона в java в 6u10, но это официально не описано в API. В Java 7 функциональность была официально добавлена ​​в API с помощью методов setBackground (), setOpacity () и setShape () класса Window .

Поведение описывается Oracle здесь

Внизу приведен пример кода для эффекта градиента.

Этот метод будет работать только в том случае, если соответствующий оконный менеджер ОС поддерживает его. X11 (Linux) требует, чтобы менеджер окон компоновки был установлен и настроен правильно. Это описано в известных проблемах примечаний к выпуску Java 7 и в этой ошибке .

1 голос
/ 16 мая 2012

Я фактически работал в расширенном классе JFrame с полупрозрачными градиентами в JFrame

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;

public class JFrameGradient extends JFrame
{
private static final long serialVersionUID = 7565267933439533086L;
private Color initialColor;
private Color finalColor;
public static final int VERTICAL = 0;
public static final int HORIZONTAL = 1;
private int orientation = VERTICAL;

private int MAX_WIDTH = 1;
private int MAX_HEIGHT = 1;

private int xInitial = 0;
private int xFinal = 0;
private int yInitial = 0;
private int yFinal = 0;

private int initialRedComponent;
private int initialGreenComponent;
private int initialBlueComponent;

private int finalRedComponent;
private int finalGreenComponent;
private int finalBlueComponent;

private int delta = 1;
private String title;
private GraphicsConfiguration gc;
private JFrame frame;
private Graphics g;
private double transparency;
private JPanel gradientPane = new JPanel(true);
private boolean isColorChanged = false;



 public JFrameGradient( Color initialColor, Color finalColor , double transparency )
{
    super();
    this.frame = this;
    setTransparency(transparency);
    initClass();
    initColor(initialColor, finalColor);
}

 public JFrameGradient( String title , Color initialColor, Color finalColor , double transparency)
 {
     super(title);
     this.title = title;
     setTransparency(transparency);
     initClass();
     initColor(initialColor, finalColor);
 }

 public JFrameGradient( GraphicsConfiguration gc , Color initialColor, Color finalColor , double transparency)
 {
     super(gc);
     this.setGc(gc);
     setTransparency(transparency);
     initClass();
     initColor(initialColor, finalColor);
 }

 public JFrameGradient( GraphicsConfiguration gc , String title , Color initialColor, Color finalColor , double transparency)
 {
     super( title , gc );
     this.title = title;
     this.setGc(gc);
     setTransparency(transparency);
     initClass();
     initColor(initialColor, finalColor);
 }

 public JFrameGradient(  double transparency)
 {
     this( Color.black , Color.white , transparency);
 }

 public JFrameGradient(String title , double transparency)
 {
     this( title , Color.black , Color.white , transparency);
 }

 public JFrameGradient( GraphicsConfiguration gc , double transparency)
 {
     this( gc , Color.black , Color.white , transparency);
 }

 public JFrameGradient( GraphicsConfiguration gc , String title , double transparency)
 {
     this( gc , title , Color.black , Color.white , transparency);
 }

 public JFrameGradient()
 {
     this( Color.black , Color.white , 1);
 }

 public JFrameGradient(String title)
 {
     this( title , Color.black , Color.white , 1);
 }

 public JFrameGradient( GraphicsConfiguration gc)
 {
     this( gc , Color.black , Color.white , 1);
 }

 public JFrameGradient( GraphicsConfiguration gc , String title)
 {
     this( gc , title , Color.black , Color.white , 1);
 }

public Color getInitialColor()
{
    return initialColor;
}

public Color getFinalColor()
{
    return finalColor;
}

public void setInitialColor(Color initialColor)
{
    this.initialColor = initialColor;
    isColorChanged = true;
    if(isVisible())
    {
        repaint();
    }
}

public void setFinalColor(Color finalColor)
{
    this.finalColor = finalColor;
    isColorChanged = true;
    if(isVisible())
    {
        repaint();
    }
}

public String getTitle()
{
    return title;
}

public double getTransparency()
{
    return transparency;
}

public void setTransparency(double transparency)
{
    if( ( transparency >= 0.0) && (transparency <= 1.0) )
    {
        this.transparency = transparency;
    }
    else
    {
        this.transparency = 1.0;
    }
}

/**
 * @return the gc
 */
public GraphicsConfiguration getGc()
{
    return gc;
}

/**
 * @param gc the gc to set
 */
private void setGc(GraphicsConfiguration gc)
{
    this.gc = gc;
}

public int getOrientation()
{
    return orientation;
}

public void setOrientation(int orientation)
{
    this.orientation = orientation;
    if( isVisible())
    {
        repaint();
    }

}


private void initColor(Color initialColor, Color finalColor)
{
    this.initialColor = initialColor;
    this.finalColor = finalColor;

    this.initialRedComponent = initialColor.getRed();
    this.initialGreenComponent = initialColor.getGreen();
    this.initialBlueComponent = initialColor.getBlue();

    this.finalRedComponent = finalColor.getRed();
    this.finalGreenComponent = finalColor.getGreen();
    this.finalBlueComponent = finalColor.getBlue();

}

private void initClass()
{
    if( this != null)
    {
        frame = this;
        frame.add(gradientPane);
        frame.pack();
    }
}

@Override
public void paint(Graphics g)
{
    super.paint(g);
    paintGradient(g);
    Rectangle mask = null;

    for( Component c : getComponents() )
    {
        if( c instanceof JRootPane )
        {
            JRootPane rootPane = (JRootPane) c;
            rootPane.setDoubleBuffered(true);
            for( Component cRootPane : rootPane.getComponents())
            {
                 if( cRootPane instanceof JLayeredPane)
                 {
                    JLayeredPane cLayerPanels = (JLayeredPane) cRootPane;
                    cLayerPanels.setDoubleBuffered(true);
                    for( Component cLayerPanel : cLayerPanels.getComponents() )
                    {
                        if( cLayerPanel instanceof JPanel)
                        {
                            JPanel cPanels = (JPanel) cLayerPanel;
                            cPanels.setDoubleBuffered(true);

                            for( Component cPanel : cPanels.getComponents() )
                            {
                                if( cPanel instanceof JPanel)
                                {
                                    JPanel cPanels2 = (JPanel) cPanel;
                                    cPanels2.setDoubleBuffered(true);
                                     mask = frame.getBounds();
                                    for( Component cPanel2 : cPanels2.getComponents() )
                                    {
                                        mask.union(cPanel2.getBounds());
                                        cPanel2.paint(cPanel2.getGraphics());
                                    }

                                }
                            }
                        }
                    }
                }
            }
        }
    }
    g.setClip(mask);
}


private void paintGradient(Graphics g)
{
    if( isColorChanged == true)
    {
        initColor(initialColor, finalColor);
        isColorChanged = false;
    }

    if ( orientation == VERTICAL)
    {
        if ( this.getWidth() != 0 )
        {
            MAX_WIDTH = this.getWidth();
        }

        if ( this.getHeight() != 0)
        {
            MAX_HEIGHT = this.getHeight();
            xFinal = MAX_WIDTH;
            delta = MAX_HEIGHT;
        }

    } else if( orientation == HORIZONTAL )
    {
        if ( this.getHeight() != 0 )
        {
            MAX_HEIGHT = this.getHeight();
        }

        if ( this.getWidth() != 0)
        {
            MAX_WIDTH = this.getWidth();
            yFinal = MAX_HEIGHT;
            delta = MAX_WIDTH;
        }

    }

    if ( (this.initialColor != null ) && (this.finalColor != null) )
    {

        if ( delta == 0)
        {
            delta = 1;
        }

         if( orientation == VERTICAL)
         {
             for( int n = 0 ; n < MAX_HEIGHT ; n++)
             {
                 calculateColor(g, n);
                 g.drawLine(xInitial, n, xFinal, n);
             }
         } else if (orientation == HORIZONTAL)
         {
            for( int n = 0 ; n < MAX_WIDTH ; n++)
             {
                 calculateColor(g, n);
                 g.drawLine(n , yInitial, n , yFinal);
                 delta = Math.max( MAX_HEIGHT , MAX_WIDTH);
              }
          }



     }

    }

private void calculateColor(Graphics g, int n)
{
    int redComponent = 0;
    int greenComponent = 0;
    int blueComponent = 0;

    redComponent = interpolateComponent(n, initialRedComponent, finalRedComponent, delta);
     greenComponent = interpolateComponent(n, initialGreenComponent, finalGreenComponent, delta);
     blueComponent = interpolateComponent(n, initialBlueComponent, finalBlueComponent, delta);

     if( redComponent > 255)
     {
         redComponent = 255;
     } else if ( redComponent < 0)
     {
         redComponent = 0;
     }

     if( greenComponent > 255)
     {
         greenComponent = 255;
     } else if ( greenComponent < 0)
     {
         greenComponent = 0;
     }

     if( redComponent > 255)
     {
         blueComponent = 255;
     } else if ( redComponent < 0)
     {
         blueComponent = 0;
     }

     g.setColor( new Color(redComponent , greenComponent , blueComponent , (int) (255 * transparency) ));
}

private int interpolateComponent( int x , int xInit , int xFinal , int delta )
{
    int returnValue = 0 ;

    if ( xInit < xFinal ) {
        double slope =  (xFinal - xInit) / (double) delta ;

        returnValue = (int) ( xInit + slope * x );
    }
    else if( xFinal < xInit ) {
        double slope =  (xInit - xFinal) / (double) delta ;

        returnValue = (int) ( xInit - slope * x );
    } else {
        returnValue = xInit;
    }


    return returnValue;

}

@Override
public void setVisible(boolean aFlag)
{
    if (aFlag == true)
    {
        g = gradientPane.getGraphics();
        paint(g);
        frame.pack();
    }

        super.setVisible(aFlag);

}
public void setPreferredSize(int width, int height)
{
    setPreferredSize(new Dimension(width, height));
}

}

1 голос
/ 20 июля 2011

Только Mac OSX обеспечивает прозрачные / полупрозрачные кадры в Java.

Если у вас есть Mac, вам следует начать с установки прозрачного фона:

frame.setBackground(new Color(0, 0, 0, 0));

Затем -- Я думаю (пока у меня нет Mac: P) - переопределить метод paintComponents(Graphics):

public void paintComponents(Graphics g)
{
     Graphics2D g2 = (Graphics2D) g;
     g2.setPaint(new GradientPaint(
     new Point(0, 0), 
     new Color(0.0f, 0.0f, 0.0f, 0.0f), 
     new Point(0, getHeight()), 
     new Color(0.0f, 0.0f, 0.0f, 0.8f)));
     super.paintComponents(g);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...