Java 更改标签文本轮廓的厚度

Java 更改标签文本轮廓的厚度,java,swing,text,jlabel,Java,Swing,Text,Jlabel,起初,我想为我的Jlabel添加一个轮廓,我找到了这个源代码,它可以工作,但我不能更改轮廓厚度的大小 我想使用相同的代码将标签文本的厚度更改为更厚(因为此代码易于实现)…但我不知道如何更改轮廓的厚度…任何帮助都是合适的 package Test2; import java.awt.*; import javax.swing.*; public class OutlineLabel extends JLabel { private Color outlineColor = Color

起初,我想为我的Jlabel添加一个轮廓,我找到了这个源代码,它可以工作,但我不能更改轮廓厚度的大小

我想使用相同的代码将标签文本的厚度更改为更厚(因为此代码易于实现)…但我不知道如何更改轮廓的厚度…任何帮助都是合适的

package Test2;

import java.awt.*;
import javax.swing.*;

public class OutlineLabel extends JLabel {

    private Color outlineColor = Color.WHITE;
    private boolean isPaintingOutline = false;
    private boolean forceTransparent = false;

    public OutlineLabel() {
        super();
    }

    public OutlineLabel(String text) {
        super(text);
    }

    public OutlineLabel(String text, int horizontalAlignment) {
        super(text, horizontalAlignment);
    }

    public Color getOutlineColor() {
        return outlineColor;
    }

    public void setOutlineColor(Color outlineColor) {
        this.outlineColor = outlineColor;
        this.invalidate();
    }

    @Override
    public Color getForeground() {
        if (isPaintingOutline) {
            return outlineColor;
        } else {
            return super.getForeground();
        }
    }

    @Override
    public boolean isOpaque() {
        if (forceTransparent) {
            return false;
        } else {
            return super.isOpaque();
        }
    }

    @Override
    public void paint(Graphics g) {

        String text = getText();
        if (text == null || text.length() == 0) {
            super.paint(g);
            return;
        }

        // 1 2 3
        // 8 9 4
        // 7 6 5

        if (isOpaque())
            super.paint(g);

        forceTransparent = true;
        isPaintingOutline = true;
        g.translate(-1, -1);
        super.paint(g); // 1
        g.translate(1, 0);
        super.paint(g); // 2
        g.translate(1, 0);
        super.paint(g); // 3
        g.translate(0, 1);
        super.paint(g); // 4
        g.translate(0, 1);
        super.paint(g); // 5
        g.translate(-1, 0);
        super.paint(g); // 6
        g.translate(-1, 0);
        super.paint(g); // 7
        g.translate(0, -1);
        super.paint(g); // 8
        g.translate(1, 0); // 9
        isPaintingOutline = false;

        super.paint(g);
        forceTransparent = false;

    }

    public static void main(String[] args) {
        JFrame w = new JFrame();
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        OutlineLabel label = new OutlineLabel("change the outline thickness", OutlineLabel.CENTER);
        label.setFont(new Font("Serif", Font.BOLD, 48));
        label.setOutlineColor(Color.black);
        label.setForeground(Color.white);
        label.setOpaque(true);
        w.setContentPane(new JPanel(new BorderLayout()));
        w.add(label, BorderLayout.CENTER);
        w.pack();
        w.setVisible(true);
    }
}

下面是输出的样子:
我改变了轮廓的厚度

我修改了
OutlineLabel
类的
paint
方法以包含厚度值

下面是修改后的完整可运行代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

public class OutlineLabelGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new OutlineLabelGUI());
    }

    @Override
    public void run() {
        JFrame w = new JFrame();
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        OutlineLabel label = new OutlineLabel("change the "
                + "outline thickness", JLabel.CENTER, 3);
        label.setFont(new Font("Serif", Font.BOLD, 48));
        label.setOutlineColor(Color.black);
        label.setForeground(Color.white);
        label.setOpaque(true);
       
        w.add(label, BorderLayout.CENTER);
        w.pack();
        w.setLocationByPlatform(true);
        w.setVisible(true);
    }

    public class OutlineLabel extends JLabel {

        private static final long serialVersionUID = 1L;
        
        private Color outlineColor = Color.WHITE;
        
        private boolean isPaintingOutline = false;
        private boolean forceTransparent = false;
        
        private final int thickness;

        public OutlineLabel(int thickness) {
            super();
            this.thickness = thickness;
            setBorder(thickness);
        }

        public OutlineLabel(String text, int thickness) {
            super(text);
            this.thickness = thickness;
            setBorder(thickness);
        }

        public OutlineLabel(String text, int horizontalAlignment, 
                int thickness) {
            super(text, horizontalAlignment);
            this.thickness = thickness;
            setBorder(thickness);
        }
        
        private void setBorder(int thickness) {
            Border border = getBorder();
            Border margin = new EmptyBorder(thickness, thickness + 3, 
                    thickness, thickness + 3);
            setBorder(new CompoundBorder(border, margin));
        }

        public Color getOutlineColor() {
            return outlineColor;
        }

        public void setOutlineColor(Color outlineColor) {
            this.outlineColor = outlineColor;
            this.invalidate();
        }

        @Override
        public Color getForeground() {
            if (isPaintingOutline) {
                return outlineColor;
            } else {
                return super.getForeground();
            }
        }

        @Override
        public boolean isOpaque() {
            if (forceTransparent) {
                return false;
            } else {
                return super.isOpaque();
            }
        }

        @Override
        public void paint(Graphics g) {
            String text = getText();
            if (text == null || text.length() == 0) {
                super.paint(g);
                return;
            }

            // 1 2 3
            // 8 9 4
            // 7 6 5

            if (isOpaque()) {
                super.paint(g);
            }

            forceTransparent = true;
            isPaintingOutline = true;
            g.translate(-thickness, -thickness);
            super.paint(g); // 1
            g.translate(thickness, 0);
            super.paint(g); // 2
            g.translate(thickness, 0);
            super.paint(g); // 3
            g.translate(0, thickness);
            super.paint(g); // 4
            g.translate(0, thickness);
            super.paint(g); // 5
            g.translate(-thickness, 0);
            super.paint(g); // 6
            g.translate(-thickness, 0);
            super.paint(g); // 7
            g.translate(0, -thickness);
            super.paint(g); // 8
            g.translate(thickness, 0); // 9
            isPaintingOutline = false;

            super.paint(g);
            forceTransparent = false;
        }

    }

}
看起来很酷