I have a JLabel that I do setBackground(Color.WHITE)
and setBorder(new CustomTitledBorder(Color.BLACK, "Some Text")
. The white background from the JLabel is outside of the border bounds. I tried looking around and found this solution:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class TempFrame extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TempFrame frame = new TempFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TempFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);
var label = new MyLabel();
label.setBounds(10, 10, 334, 65);
getContentPane().add(label);
JButton btnNewButton = new JButton("Click To Add Text");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("String");
}
});
btnNewButton.setBounds(127, 86, 89, 23);
contentPane.add(btnNewButton);
}
private class MyLabel extends JLabel {
public MyLabel() {
setOpaque(true);
setBorder(new CustomTitledBorder(Color.BLACK, "Title Here"));
setBackground(Color.WHITE);
}
/* Here is where I am having the problem */
// @Override
// protected void paintComponent(Graphics g) {
// var insets = this.getBorder().getBorderInsets(this);
// g.setColor(Color.WHITE);
// g.fillRect(insets.left, insets.top, getWidth() - insets.left - insets.right,
// getHeight() - insets.top - insets.bottom);
// }
}
private class CustomTitledBorder extends TitledBorder {
public CustomTitledBorder(Color color, String title) {
super(new LineBorder(color), title);
}
}
}
This is without modifying the paintComponent()
method
This is what I want the paintComponent()
method to do
If I try to add text to it using setText("String");
, this is the result. I can see some of my other components too somehow overlapping each other in that corner
How do I make it so that it does not do that?
Based on the image provided it appears you want the background color of the parent panel to be used for the background of the border and provide a different background color for the remainder of the label.
So this means that you need to:
So your custom label class should be:
private class MyLabel extends JLabel
{
public MyLabel()
{
//setOpaque(true);
setBorder(new CustomTitledBorder(Color.BLACK, "Title Here"));
setBackground(Color.WHITE);
}
@Override
protected void paintComponent(Graphics g)
{
var insets = this.getBorder().getBorderInsets(this);
g.setColor(Color.WHITE);
g.fillRect(insets.left, insets.top, getWidth() - insets.left - insets.right, getHeight() - insets.top - insets.bottom);
super.paintComponent(g);
}
}