Je travaille sur la création d'un JPanel
qui prend en charge la transparence, et qui est venu au problème que je ne suis pas sûr de la façon d'appliquer le même niveau de transparence à tous Component
ajouté à ce panneau. Mon code à ce jour:Java Swing - Appliquer transparence aux composants sur transparent JPanel
package de.uebertreiberman.project.swing;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class JTransparancyPanel extends JPanel {
float opacity = 1.0f;
/**Constructor for JTransparentPanel
*/
public JTransparancyPanel()
{
super();
this.setOpaque(false);
}
/**Getter for opacity value of panel
*
* @return float containing opacity value of frame (0-1)
*/
public float getOpacity()
{
return opacity;
}
/**Setter for opacity value of panel
*
* @param value as float for opacity of frame (0-1)
*/
public void setOpacity(float value)
{
opacity = value;
repaint();
}
/**Converts opacity value (0-1) to opacity color (0-255)
*
* @param opacity as float opacity value (0-1)
* @return integer containing converted opacity value (0-255)
*/
public static int getOpacityColor(float opacity)
{
return (int)(opacity * 255);
}
/**Converts opacity color (0-255) to opacity value (0-1)
*
* @param opacity as integer value (0-255)
* @return float containing converted opacity value (0-1)
*/
public static float getOpacityValue(int opacity)
{
//Returns more or less the correct, capped value
//Just ignore it, it works, leave it :D
return capFloat((3.9216f*opacity)/1000f, 0.0f, 1.0f);
}
/**Returns float capped between minimum and maximum value
*
* @param value as original value
* @param min as minimum cap value
* @param max as maximum cap value
* @return float containing capped value
*/
public static float capFloat(float value, float min, float max)
{
if(value < min) value = min;
else if(value > max) value = max;
return value;
}
/**Merges color and opacity to new color
*
* @param bg as color for old color, only RGB will be used from that
* @return color with RGB from bg and A from opacity of frame
*/
Color getTransparencyColor(Color bg)
{
return new Color(getOpacityValue(bg.getRed()), getOpacityValue(bg.getGreen()), getOpacityValue(bg.getBlue()), opacity);
}
@Override
public void paintComponent(Graphics g)
{
//Draw transparent background before painting other Components
g.setColor(getTransparencyColor(getBackground()));
Rectangle r = g.getClipBounds();
g.fillRect(r.x, r.y, r.width, r.height);
//Paint other components
super.paintComponent(g);
}
}
La partie importante est fondamentalement à la fin où j'overwride la méthode paintComponent(Graphics g)
.
Je prends simplement le backgroundcolor
, appliquez la transparence et réglez-le.
Maintenant, je veux que tous les enfants composant de ce panneau deviennent également transparents, et je ne suis pas sûr de la manière la plus efficace de le faire.
Que suggéreriez-vous?
qui est difficile sans écraser les méthodes 'paint' /' paintComponent' des composants respectifs. Rien n'empêche un composant enfant de remplir de façon flagrante sa zone avec une couleur solide et opaque. On pourrait essayer de tricher en peignant les composants enfants dans une image, puis en peignant cette image avec une opacité appropriée. Je vais essayer, mais c'est peut-être un peu compliqué. – Marco13
Je n'ai pas essayé et je n'aurai pas le temps aujourd'hui, mais ne pouvez-vous pas simplement obtenir les composants ('Component [] components = jpanel.getComponents();'), les parcourir et définir leurs arrière-plans en utilisant 'getGraphics() .setBackgroundColour() '? – MrB