[英]Raisd border in JPanel
I need to Override a JPanel
and make it Raisd. 我需要重写一个
JPanel
并将其设为Raisd。 See my Code please. 请参阅我的代码。
public class CustomJPanel extends JPanel {
public CustomJPanel(int size){
setForeground(Color.black); // foreground will be black
setOpaque(false);
}
@Override
protected void paintBorder(Graphics myGraphics){
myGraphics.setColor(Color.black);
myGraphics.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, 20, 20);
}
}
Actually, i need to have a JPanel Raisd with rounded corners
实际上,我需要一个带有圆角的JPanel Raisd
Border
It's pretty basic, but it gets the idea across... 这是非常基本的,但是可以使想法得以传播...
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setBorder(new MyRoundedBorder());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.dispose();
}
}
public static class MyRoundedBorder implements Border {
protected static final Insets DEFAULT_INSETS = new Insets(4, 4, 4, 4);
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.setColor(Color.WHITE);
Shape corner = new RoundedShape(width - 8, height - 8, 40);
g2d.translate(x + 2, y + 2);
g2d.draw(corner);
g2d.transform(AffineTransform.getRotateInstance(Math.toRadians(180), (width - 8) / 2, (height - 8) / 2));
g2d.setColor(Color.LIGHT_GRAY);
g2d.draw(corner);
g2d.dispose();
}
@Override
public Insets getBorderInsets(Component c) {
return DEFAULT_INSETS;
}
@Override
public boolean isBorderOpaque() {
return true;
}
public class RoundedShape extends Path2D.Float {
public RoundedShape(int width, int height, int size) {
moveTo(0, height - size);
append(new Arc2D.Float(0, height - size, size, size, 180, 45, Arc2D.CHORD), false);
lineTo(0, size);
curveTo(0, 0, 0, 0, size, 0);
lineTo(width - size / 2, 0);
append(new Arc2D.Float(width - size, 0, size, size, 90, -45, Arc2D.CHORD), false);
}
}
}
}
Graphics
Graphics
The problem with borders is you can't fill them, not really, it's kind of messy. 边界的问题是您无法填充边界,不是真的,这有点混乱。
This leaves you with a problem with you want a non-rectangular component. 这给您带来了一个需要非矩形组件的问题。 Instead, you need to get a little more creative.
相反,您需要多一点创意。
The following makes use of to "clipped" areas to paint a RoundRectangle2D
in two different colors 下面利用“剪切”区域以两种不同的颜色绘制
RoundRectangle2D
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.GeneralPath;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(new EmptyBorder(10, 10, 10, 10));
panel.setBackground(Color.RED);
frame.setContentPane(panel);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setOpaque(false);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
Shape border = new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 20, 20);
g2d.setColor(getBackground());
g2d.fill(border);
GeneralPath upperClip = new GeneralPath();
upperClip.moveTo(0, 0);
upperClip.lineTo(getWidth() - 1, 0);
upperClip.lineTo(0, getHeight() - 1);
Graphics2D clipped = (Graphics2D) g2d.create();
clipped.setClip(upperClip);
clipped.setColor(Color.WHITE);
clipped.draw(border);
clipped.dispose();
GeneralPath lowerClip = new GeneralPath();
lowerClip.moveTo(0, getHeight());
lowerClip.lineTo(getWidth(), 0);
lowerClip.lineTo(getWidth(), getHeight());
clipped = (Graphics2D) g2d.create();
clipped.setClip(lowerClip);
clipped.setColor(Color.black);
clipped.draw(border);
clipped.dispose();
g2d.dispose();
}
}
}
LinearGradientPaint
A technique I've used in the past is to paint a RoundRectangle2D
with a LinearGradientPaint
, this gives a "slight" effect off shading which can produce a desirable result, if you're willing to play around with the properties 我过去使用的一种技术是使用
LinearGradientPaint
绘制RoundRectangle2D
,如果您愿意使用这些属性,则可以使阴影产生“轻微”的效果,可以产生理想的效果
Try setting border while JPanel object is being created. 创建JPanel对象时尝试设置边框。
public CustomJPanel(int size){
setForeground(Color.black); // foreground will be black
setOpaque(false);
setBorder(new BevelBorder(BevelBorder.RAISED)); // Set Border Type
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.