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

时间:2013-11-23 17:43:45

标签: java swing jframe border shadow

我目前从DropShadowBorder库中拥有javax.swing.border.Border类(扩展SwingX类),因此这是常规Border的实例。我想在我未修饰的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内部绘制的。

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


可用于解决此问题的一种方法是创建一个透明的不同的未修饰的全屏窗口,将普通窗口置于此窗口之上。此全屏窗口用于绘制阴影,因此不需要在帧本身中绘制阴影。这是一个获得类似结果的解决方案,但这是我想要的。我想画框外的边框。这些解决方案通常会导致其他问题。

3 个答案:

答案 0 :(得分:15)

是的,您可以在未修饰的JFrame周围绘制边框。 只需简单地获取JFrame的根窗格并通过setBorder(边框边框)方法设置其边框。

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

} 

enter image description here

答案 1 :(得分:1)

JFrames和JDialogs是唯一需要与外部窗口系统交互的(swing)窗口。 要获得外部阴影,您需要外部上下文。请参阅以下答案:

Undecorated JFrame shadow

答案 2 :(得分:0)

来自http://nadeausoftware.com/articles/2009/02/windows_java_tip_how_control_window_decorations

  

一些Java外观可以提供自己的标题栏,图标和窗口边框。如果外观支持此功能,则其getSupportsWindowDecorations()方法将返回true。

所以你需要实现自己的Java Look&感觉。