Java:如何在未装饰的JFrame周围绘制边框?

10

我目前有一个继承自javax.swing.border.Border类的DropShadowBorder类,这是SwingX库中的一个常规边框实例。我想在我的无装饰JFrame周围绘制此边框。我目前正在使用以下方法在我的JFrame内设置边框:

DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true);
this.getRootPane().setBorder(b);

注意:我正在使用框架的根面板来绘制边框,因为框架本身不支持边框。

问题在于边框是在组件本身内部绘制的,如下图所示,阴影边框在框架本身的边界内部绘制:

enter image description here

注意:(阴影)边框是在框架内部绘制的,而不是在框架外部。

无论使用何种边框,所有边框都会在JFrame本身内部绘制。

我的问题是:是否可能在框架周围绘制任何边框,而不仅仅是在边框范围内部绘制?


解决此问题的一种方法是创建一个不同的无装饰全屏窗口,其为透明的,将普通窗口放在其上方。这个全屏窗口用于绘制阴影,因此阴影不需要在框架自身中绘制。这是获得类似结果的解决方案,但这不是我想要的。我想在框架外绘制边框。这种解决方案通常会引起其他问题。


1
这里是一行程序代码:this.getContentPane().setBorder(b);,但更好的做法是在JPanel上使用边框。 - mKorbel
不可能在窗口本身周围绘制边框,而不是在窗口的根面板周围绘制。 - 不可能。您试图解决什么问题? - camickr
我想给我的无装饰 JFrame 添加阴影。目前,我有一个边框,它会像您在我的问题中看到的图片一样创建阴影。问题是这些边框是在组件内部绘制的。例如,在该图像上,边框是在框架边界的内部绘制的。有没有办法将此阴影边框绘制在框架的外部? 注意:我已更新问题,以使所有内容更加清晰。 - Tim Visée
可能是未装饰的JFrame阴影的重复问题。 - tucuxi
3个回答

22

是的,您可以在未装饰的JFrame周围绘制边框。 只需获取JFrame的根窗格并使用setBorder(Border border)方法设置其边框即可。

getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED));
例如:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Borders2UndecoFrame extends JFrame{
    JLabel label = new JLabel("Welcome!", JLabel.CENTER);
    public Borders2UndecoFrame(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(200, 200));
        add(label, BorderLayout.CENTER);
        setUndecorated(true);
        getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED));
        setVisible(true);

    }
    public static void main(String[] args) {
        new Borders2UndecoFrame();
    }

} 

输入图像描述


据我所知,这只会缩小根窗格,以便在框架内绘制边框。这可能对某些情况来说是完美的,但对于阴影来说,似乎效果不太好。请查看我在问题中放置的图像,该示例显示了我正在谈论的内容。无论如何,感谢您的回答和代码示例! - Tim Visée
确实,它会缩小rootPane但通过添加边框的大小来增加框架的大小。此外,您的问题不是关于阴影,而是关于边框。谢谢。 - Hanzallah Afgan
我必须承认你说得对。我在我的问题中确实注意到我想要在框架周围画边框,但是这个答案只在根面板周围画了边框,而不是在框架周围画边框。所以很抱歉这并没有真正解决我的问题。 - Tim Visée

1
JFrames和JDialogs是需要与外部窗口系统交互的唯一(swing)窗口。要获得外部阴影,您需要外部上下文。请参见此答案以了解如何获取它:

未装饰的JFrame阴影


需要使用多个层吗?在这个例子中,创建了一个新的内容面板来放置所有的框架内容。阴影是直接画在框架上的。是否必须使用这种方法,问题是这很容易引起窗口对齐和全屏问题。 - Tim Visée

0

不错的文章,非常有用,但是它没有告诉我如何在JFrame周围绘制阴影或任何其他边框。 - Tim Visée

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接