我有一個 JLabelsetBackground(Color.WHITE)和setBorder(new CustomTitledBorder(Color.BLACK, "Some Text"). JLabel 的白色背景超出了邊界范圍。我試著環顧四周,找到了這個解決方案:
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);
}
}
}
這是不修改paintComponent()方法

這就是我想要的paintComponent()方法

如果我嘗試使用 向它添加文本setText("String");,這就是結果。我可以看到我的其他一些組件也在那個角落以某種方式相互重疊

我怎樣才能讓它不那樣做?
uj5u.com熱心網友回復:
根據提供的影像,您似乎希望將父面板的背景顏色用作邊框的背景,并為標簽的其余部分提供不同的背景顏色。
所以這意味著你需要:
- 保持標簽透明,以便首先繪制父級的背景
- 繪制標簽的背景減去邊框使用的區域
- 繪制標簽的文本
所以你的自定義標簽類應該是:
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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/489649.html
