简体   繁体   English

JPanel中的Raisd边框

[英]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);

            }

        }

    }

}

Custom 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM