Java 在Swing中的组件文本下方绘制边框

Java 在Swing中的组件文本下方绘制边框,java,swing,graphics,border,Java,Swing,Graphics,Border,我创建了一个自定义边框类,在其中填充一个矩形作为组件的背景。请注意,此边框将来将具有更复杂的形状,而不仅仅是一个简单的矩形 将边框添加到组件时,组件的文本将显示在边框后面,使文本无法读取。(结果如下图所示。) 有没有办法在文本下面画边框 我的边境班: public class CustomBorder extends AbstractBorder { private static final long serialVersionUID = 1L; @Override

我创建了一个自定义边框类,在其中填充一个矩形作为组件的背景。请注意,此边框将来将具有更复杂的形状,而不仅仅是一个简单的矩形

将边框添加到组件时,组件的文本将显示在边框后面,使文本无法读取。(结果如下图所示。)

有没有办法在文本下面画边框

我的边境班:

public class CustomBorder extends AbstractBorder {
    private static final long serialVersionUID = 1L;

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(new Color(125, 125, 125, 255));
        g2d.fillRect(x - 10, y - 10, width + 20, height + 20);
    }

    @Override
    public Insets getBorderInsets(Component c) {
        return super.getBorderInsets(c);
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        return super.getBorderInsets(c, insets);
    }

    @Override
    public boolean isBorderOpaque() {
        return super.isBorderOpaque();
    }
}
主要内容:

编辑:我还应该注意,我将使用此边框创建一个聊天程序,该程序将使用气泡形状的消息,因此使用setBackground()的彩色正方形是不允许的。

请参见说明如何绘制。在绘制标签文本后绘制边框

你到底想干什么?你的边界绘制代码没有意义。您尝试填充的矩形等于组件的宽度/高度+20像素,这意味着您尝试绘制的区域比组件大

如果您只是尝试在标签上绘制背景,则可以使用:

label.setOpaque( true );
label.setBackground(...);
编辑:下面的注释部分中链接的代码解决了问题。

请参见说明如何绘制的代码。在绘制标签文本后绘制边框

你到底想干什么?你的边界绘制代码没有意义。您尝试填充的矩形等于组件的宽度/高度+20像素,这意味着您尝试绘制的区域比组件大

如果您只是尝试在标签上绘制背景,则可以使用:

label.setOpaque( true );
label.setBackground(...);

编辑:下面注释部分中链接的代码解决了问题。

您可以始终使用
g2d.drawString()
。 但是,如果出于某种原因不能使用,您可以:

JLabel l = new JLabel("foo");
l.setBackground(Color.GRAY);
l.setOpaque(true);

您可以始终使用
g2d.drawString()
。 但是,如果出于某种原因不能使用,您可以:

JLabel l = new JLabel("foo");
l.setBackground(Color.GRAY);
l.setOpaque(true);

在组件的内容上绘制边框。您需要的是绘制背景。边框绘制在组件的内容上。你想要的是画一个背景。我正在尝试为我的组件制作一个定制的边框,它将充当聊天信息,边框的形状将像一个语音泡泡;我做了一个矩形来缩短代码。+20px背后的原因是在文本周围留出一些空间。@Spitz Borders“围绕”一个组件。对于您尝试执行的操作,您可能需要从定义要使用的形状的基础组件开始,然后向其添加其他组件。您可以查看一下,例如,
+20px背后的原因是在文本周围留出一些空间。
-您需要设置边框插入以在文本周围留出空间。签出:有关如何创建语音气泡的示例。@camickr我试图在覆盖的
getBorderInsets()
中为返回的
Insets
对象的每个值添加10,但没有任何效果。此外,我所做的是不是被认为是不好的做法?@Spitz,你的代码不起作用,所以你需要重新开始。我给了你一个链接解释为什么它不起作用。Swing组件只能在组件的边界内绘制,因此不能在组件外绘制20像素。我还为您提供了一个工作示例的链接,您可以根据自己的具体需求进行自定义。我正在尝试为我的组件制作一个自定义边框,它将充当聊天信息,边框的形状将像一个语音气泡;我做了一个矩形来缩短代码。+20px背后的原因是在文本周围留出一些空间。@Spitz Borders“围绕”一个组件。对于您尝试执行的操作,您可能需要从定义要使用的形状的基础组件开始,然后向其添加其他组件。您可以查看一下,例如,
+20px背后的原因是在文本周围留出一些空间。
-您需要设置边框插入以在文本周围留出空间。签出:有关如何创建语音气泡的示例。@camickr我试图在覆盖的
getBorderInsets()
中为返回的
Insets
对象的每个值添加10,但没有任何效果。此外,我所做的是不是被认为是不好的做法?@Spitz,你的代码不起作用,所以你需要重新开始。我给了你一个链接解释为什么它不起作用。Swing组件只能在组件的边界内绘制,因此不能在组件外绘制20像素。我还为您提供了一个链接,指向一个工作示例,您可以根据自己的具体需求进行自定义。我怀疑如果我将其绘制到组件上,长行文本是否会被包装。哦,我不知道它们将被包装。。。我会设法找到另一个解决办法。编辑:那么就把JLabel放在矩形的前面吧?看看这个:我怀疑如果我把它画到组件上,长的文本行会被包装。哦,我不知道它们会被包装。。。我会设法找到另一个解决办法。编辑:所以只需将JLabel放在矩形的前面即可?请检查以下内容: