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

标签 java swing jframe border shadow

我目前有 SwingX 库中的 DropShadowBorder 类(它扩展了 javax.swing.border.Border 类),所以这个是常规 Border 的实例。我想在未修饰的 JFrame 周围绘制此边框。我目前在我的 JFrame 中使用以下方法来设置边框:

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

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

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

enter image description here

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

无论使用何种边框,它们都在 JFrame 本身内部绘制。

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


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

最佳答案

是的,您可以在未修饰的 JFrame 周围绘制边框。 只需获取 JFrame 的根 Pane 并通过 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();
    }

} 

enter image description here

关于Java:如何在未修饰的 JFrame 周围绘制边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165698/

相关文章:

java - Thymeleaf 嵌套each 和数组索引

java - 无法在 Jboss EAP7 EAP 中上传我的 Web 应用程序

java - 在 Java 8 中尝试通过 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

java - 我可以在使用 maven-assembly-plugin 打包时创建空目录吗?

java - JPanel 未显示在 JFrame 上

java - 不可见的对象,因为重绘方法 - Java Swing

java - J树 : modify apperance regardless of L&F

java - 更改 jframe 中图标的大小和形状

java - 此方法(setSize、setDefaultCloseOperation... 对于 HelloFrame 类型未定义

java - 绘制的 JPanel 不会出现在 JFrame 中