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

Tim*_*sée 7 java swing border jframe 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);
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

使用什么样的边框并不重要,它们都是在JFrame自身内部绘制的.

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


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

Han*_*gan 17

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

getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED));
Run Code Online (Sandbox Code Playgroud)

例如:

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

} 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Rob*_*een 0

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

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

因此,您需要实现自己的 Java 外观和感觉。