【问题标题】:Swing Custom Border摆动自定义边框
【发布时间】:2013-07-24 12:51:27
【问题描述】:

有什么方法可以实现自定义javax.swing.border.Border 如图所示?

【问题讨论】:

    标签: java swing awt border


    【解决方案1】:

    您只需要扩展AbstractBorder 并覆盖其paintBorder() 方法,这是一个相关示例:

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Line2D;
    import java.awt.geom.Line2D.Double;
    import javax.swing.*;
    import javax.swing.border.AbstractBorder;
    
    public class CustomMarginBorder
    {
        private JPanel contentPane;
        private CustomBorder customBorder;
    
        private void displayGUI()
        {
            JFrame frame = new JFrame("Custom Arrow Border Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            customBorder = new CustomBorder(Color.BLUE, 15);
            contentPane = new JPanel();     
            contentPane.setBorder(customBorder);    
    
            frame.setContentPane(contentPane);
            frame.setSize(300, 300);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            Runnable runnable = new Runnable()
            {
                @Override
                public void run()
                {
                    new CustomMarginBorder().displayGUI();
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    
    class CustomBorder extends AbstractBorder
    {
        private Color borderColour;
        private int gap;
    
        public CustomBorder(Color colour, int g)
        {
            borderColour = colour;
            gap = g;
        }
    
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y
                                                       , int width
                                                       , int height)
        {
            super.paintBorder(c, g, x, y, width, height);
            Graphics2D g2d = null;
            if (g instanceof Graphics2D)
            {
                g2d = (Graphics2D) g;
                g2d.setColor(borderColour);
                //Left Border
                g2d.draw(new Line2D.Double((double)x + 10, (double)y + 10
                                    , (double)x + 10, (double)y + 20));
                g2d.draw(new Line2D.Double( (double)x + 10, (double)y + 10
                                    , (double)x + 20, (double)y + 10));
                // Right Border
                g2d.draw(new Line2D.Double( (double)width - 10, (double)y + 10
                                    , (double)width - 10, (double)y + 20));
                g2d.draw(new Line2D.Double( (double)width - 10, (double)y + 10
                                    , (double)width - 20, (double)y + 10));
                // Lower Left Border
                g2d.draw(new Line2D.Double( (double)x + 10, (double)height - 10
                                    , (double)x + 20, (double)height - 10));
                g2d.draw(new Line2D.Double( (double)x + 10, (double)height - 10
                                    , (double)x + 10, (double)height - 20));
                // Lower Right Border
                g2d.draw(new Line2D.Double( (double)width - 10, (double)height - 10
                                    , (double)width - 20, (double)height - 10));
                g2d.draw(new Line2D.Double( (double)width - 10, (double)height - 10
                                    , (double)width - 10, (double)height - 20));
            }
        }
    
        @Override
        public Insets getBorderInsets(Component c)
        {
            return (getBorderInsets(c, new Insets(gap, gap, gap, gap)));
        }
    
        @Override
        public Insets getBorderInsets(Component c, Insets insets)
        {
            insets.left = insets.top = insets.right = insets.bottom = gap;
            return insets;
        }
    
        @Override
        public boolean isBorderOpaque()
        {
            return true;
        }
    }
    

    对于粗线边框使用这个:

    class CustomBorder extends AbstractBorder
    {
        private Color borderColour;
        private int gap;
        private double rectWidth;
        private double rectHeight;
    
        public CustomBorder(Color colour, int g, double w, double h)
        {
            borderColour = colour;
            gap = g;
            rectWidth = w;
            rectHeight = h;
        }
    
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y
                                                       , int width
                                                       , int height)
        {
            super.paintBorder(c, g, x, y, width, height);
            Graphics2D g2d = null;
            if (g instanceof Graphics2D)
            {
                g2d = (Graphics2D) g;
                g2d.setColor(borderColour);
                //Left Border
                g2d.fill(new Rectangle2D.Double(
                                      (double)x + gap
                                    , (double)y + gap
                                    , rectWidth, rectHeight));
                g2d.fill(new Rectangle2D.Double(
                                      (double)x + gap
                                    , (double)y + gap + rectHeight
                                    , rectHeight, rectWidth));
                // Right Border
                g2d.fill(new Rectangle2D.Double(
                                      (double)width - gap - rectWidth
                                    , (double)y + gap
                                    , rectWidth, rectHeight));
                g2d.fill(new Rectangle2D.Double(
                                      (double)width - gap - rectHeight
                                    , (double)y + gap + rectHeight
                                    , rectHeight, rectWidth));
                // Lower Left Border
                g2d.fill(new Rectangle2D.Double(
                                      (double)x + gap
                                    , (double)height - gap - rectWidth
                                    , rectHeight, rectWidth));
                g2d.fill(new Rectangle2D.Double(
                                      (double)x + gap
                                    , (double)height - gap
                                    , rectWidth, rectHeight));
                // Lower Right Border
                g2d.fill(new Rectangle2D.Double(
                                      (double)width - gap - rectHeight
                                    , (double)height - gap - rectWidth
                                    , rectHeight, rectWidth));
                g2d.fill(new Rectangle2D.Double(
                                      (double)width - gap - rectWidth
                                    , (double)height - gap
                                    , rectWidth, rectHeight));
            }
        }
    
        @Override
        public Insets getBorderInsets(Component c)
        {
            return (getBorderInsets(c, new Insets(gap, gap, gap, gap)));
        }
    
        @Override
        public Insets getBorderInsets(Component c, Insets insets)
        {
            insets.left = insets.top = insets.right = insets.bottom = gap;
            return insets;
        }
    
        @Override
        public boolean isBorderOpaque()
        {
            return true;
        }
    }
    

    输出:

    细而粗线的边框

    对于

    【讨论】:

    • ..很好。 :) 另见How do I create screenshots?(有关制作出色截图的技巧)。
    • @AndrewThompson :我的鼠标表现得很奇怪,似乎是时候更换鼠标了,因为它在被拖动时很少使用。我将链接添加到我的最爱,因为您之前曾指出过我一次,关于同一件事:-)。其余的你是最欢迎和保持微笑:-)
    • 我主要是在想 Alt+PrintScreen 将如何“自动修剪”活动窗口,现在不确定它在长(长)线程中的位置。 ;)
    • 感谢回复,细线边框代码中的g2d.setStroke(new BasicStroke(5));可以在不更改所有代码的情况下更改为粗线。
    【解决方案2】:

    是的。示例见this answer

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多