gum*_*ruh 5 java swing gradient border colors
我尝试了以下示例来应用线性渐变:GradientPaintDemo2D.
它运行良好,但我希望渐变颜色应用于Java Swing遮罩边框.我试过这个:
javax.swing.BorderFactory.createMatteBorder(1, 50, 1, 50, color)
Run Code Online (Sandbox Code Playgroud)
但这只适用于一种类型Color,而不是GradientPaint.
众所周知,GradientPaint包含两种颜色混合在一起,如上面链接的示例所示.那么这个案例的替代答案是什么呢?
Mik*_*rin 10
对于这种特定情况,您需要创建自己的边框.
以下是渐变边框类的示例:
public static class GradientBorder implements Border
{
private Insets margin;
public GradientBorder ( int top, int left, int bottom, int right )
{
super ();
margin = new Insets ( top, left, bottom, right );
}
public void paintBorder ( Component c, Graphics g, int x, int y, int width, int height )
{
Graphics2D g2d = ( Graphics2D ) g;
g2d.setPaint ( new GradientPaint ( x, y, Color.RED, x + width, y, Color.BLUE ) );
Area border = new Area ( new Rectangle ( x, y, width, height ) );
border.subtract ( new Area ( new Rectangle ( x + margin.left, y + margin.top,
width - margin.left - margin.right, height - margin.top - margin.bottom ) ) );
g2d.fill ( border );
}
public Insets getBorderInsets ( Component c )
{
return margin;
}
public boolean isBorderOpaque ()
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以指定任何其他渐变方向,颜色等.您可以将它们的初始化放入构造函数中(如果需要).要使用它,您只需要设置边框(在任何JComponent后继中):
jComponent.setBorder ( new GradientBorder ( 25, 50, 25, 50 ) );
Run Code Online (Sandbox Code Playgroud)
基本上你可以使用任何着色/动画/形状等创建任何你喜欢的边框
顺便说一下 - isBorderOpaque()方法应该返回true,如果你想创建半透明边框(例如用半透明颜色,形状有圆角等),否则你将不得不处理组件重绘问题.
如何使用新的MatteBorder(int,int,int,int,javax.swing.Icon)
//Another example:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class GradientMatteBorderTest {
public JComponent makeUI() {
Icon icon = new Icon() {
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D)g.create();
Point2D start = new Point2D.Float(0f, 0f);
Point2D end = new Point2D.Float(99f, 0f);
float[] dist = {0.0f, 0.5f, 1.0f};
Color[] colors = { Color.RED, Color.YELLOW, Color.GREEN };
g2.setPaint(new LinearGradientPaint(start, end, dist, colors));
g2.fillRect(x, y, 100, 10);
g2.dispose();
}
@Override public int getIconWidth() { return 100; }
@Override public int getIconHeight() { return 10; }
};
JLabel label = new JLabel("GradientMatteBorder");
label.setBorder(BorderFactory.createMatteBorder(10,5,10,0,icon));
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
p.add(label, BorderLayout.NORTH);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new GradientMatteBorderTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2983 次 |
| 最近记录: |