Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何在未装饰的JFrame周围绘制边框?_Java_Swing_Jframe_Border_Shadow - Fatal编程技术网

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

Java:如何在未装饰的JFrame周围绘制边框?,java,swing,jframe,border,shadow,Java,Swing,Jframe,Border,Shadow,我目前拥有SwingX库中的DropShadowBorder类(它扩展了javax.swing.border.border类),因此这是常规边框的一个实例。我想在我未装饰的JFrame周围画这个边框。我目前正在我的JFrame中使用以下方法设置边框: DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true); this.getRootPane().setBorde

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

DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true);
this.getRootPane().setBorder(b);
注意:我使用框架的根窗格来绘制边框,因为框架本身不支持边框

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

注意:(阴影)边框绘制在框架内部,与框架边界相对,而不是在框架外部

无论使用哪种边框,它们都是在
JFrame
本身内部绘制的

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


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

来自

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


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

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


是的,您可以围绕未装饰的JFrame绘制边框。 只需获取JFrame的根窗格,并通过setOrder(Border-Border)方法设置其边框即可

例如:

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

} 

this.getContentPane().setOrder(b)
,但更好的是有
JPanel
Borders
可以在框架本身周围绘制任何边框,而不能在框架的根窗格周围绘制任何边框吗?
-不。您试图解决什么问题?我想在未装饰的
JFrame
上添加一个阴影。我现在有一个边界,可以创建阴影,正如你在我的问题中的图片上看到的那样。问题在于这些边框是在设置边框的组件内部绘制的。例如,在该图像上,边框绘制在帧边界的内侧。有没有办法在帧的外部绘制此阴影边框?注意:我已经更新了这个问题,使所有内容都更加清晰。可能是尼斯文章的副本,非常有用,但这并没有告诉我如何在
JFrame
周围绘制阴影或任何其他边框。是否需要使用几个层?在该示例中,将创建一个新的内容窗格,以将所有框架内容放入其中。阴影绘制在框架本身上。是否需要使用这种方法,问题是这很容易导致窗口对齐和全屏问题。据我所知,这只会缩小根窗格,以便它可以在框架内绘制边框。这在某些情况下可能是完美的,但另一方面,对于阴影,它似乎工作得不太好。查看我在问题中放置的图像,这个示例显示了我正在谈论的内容。无论如何,谢谢你的答案和代码示例!是的,它确实会缩小根窗格,但会通过增加边框的大小来增加框架的大小。此外,你的问题不是关于阴影,而是关于边界。谢谢,我不得不说你说得对。我确实注意到在我的问题中,我想在框架周围绘制边框,这个答案在根窗格周围绘制边框,但仍然在框架内。恐怕这并不能真正解决问题。
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();
    }

}