1

In the beginning, I wanted to add an outline for my Jlabel and I found this source https://stackoverflow.com/a/23521196/14949008 and it works but I can't change the size of the outline thickness.

I wanted to change the thickness of the label text to be thicker using the same code (because this code is simple to Implement)...but I didn't understand how to change the thickness of the outline....any help would be appropriated

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);
    }
}

and here is how the output looks like : Output!

User_FOX
  • 33
  • 6

1 Answers1

5

I changed the outline thickness.

Example GUI

I modified the paint method of the OutlineLabel class to include a thickness value.

Here's the modified complete runnable code.

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;
        }

    }

}
Gilbert Le Blanc
  • 50,182
  • 6
  • 67
  • 111