java:我想使用漸變樣式透明背景到JFrame。 在上面的透明度應該是100%,但是當它下降時,它應該繼續下降,在底部應該是20%java:如何將透明漸變背景添加到JFrame
我知道我可以使用已經有這種效果的圖像,但我想提供的主題設施,並允許用戶使用自己喜歡的圖像,但允許運行時透明。
java:我想使用漸變樣式透明背景到JFrame。 在上面的透明度應該是100%,但是當它下降時,它應該繼續下降,在底部應該是20%java:如何將透明漸變背景添加到JFrame
我知道我可以使用已經有這種效果的圖像,但我想提供的主題設施,並允許用戶使用自己喜歡的圖像,但允許運行時透明。
太陽增加了對半透明背景到Java中6u10中,但沒有正式的API描述。 在Java 7中,功能通過Window類的setBackground(),setOpacity()和setShape()方法正式添加到API中。
行爲由Oracle here
描述朝向底部有漸變效果的代碼示例。
該技術只有在底層操作系統窗口管理器支持該技術時纔有效。 X11(Linux)需要合成窗口管理器才能正確安裝和配置。這在Java 7發行說明的known issues和bug中有記錄。
只有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);
}
'JFrame'沒有'setOpaque(...)'方法。 – Moonbeam
Moonbeam:糟糕:D –
實際上,我是在一個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));
}
}
謝謝..這實際上效果很好,讓我申請一個漸變到JFrame組件。然而,當框架加載時,框架上繪製的所有組件都是不可見/隱藏的,我需要將它們懸停在框架上以使其可見。你能否弄清楚爲什麼會出現這種情況?添加組件後,我確認並重新繪製,但沒有多大幫助。 – Rohan
你說的是'GradientPaint'? – Moonbeam
我想使用漸變樣式透明度 – Vivek
+1這是一個有趣的問題。我認爲會涉及一個'RescaleOp',但整個「漸變透明度」正在引發我一個循環!我也會喜歡這個,所以下班後我可以回來。 :) – Moonbeam