gpt4 book ai didi

java - 边界问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:16 26 4
gpt4 key购买 nike

我试图弄清楚边框是如何工作的,特别是插图,在搜索 Java 文档和众多网站时,我似乎无法找到明确的解释。查看这段代码:

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class ShadowWindow {

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

public ShadowWindow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new ShadowPane());

JPanel panel = new JPanel(new GridBagLayout());
panel.add(new JLabel("Look ma, no hands"));

frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class ShadowPane extends JPanel {

public ShadowPane() {
setLayout(new BorderLayout());
setOpaque(false);
setBackground(Color.BLACK);
setBorder(new EmptyBorder(0, 0, 10, 10));
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
g2d.fillRect(10, 10, getWidth(), getHeight());
g2d.dispose();
}
}
}

我解释它的方式是正在发生的事情:

  1. JFrame 框架 (200 x 200) 已创建
  2. 创建了 JPanel shadowPane(也是 200 x 200),在 JPanel 的内部底部和内部右侧创建了一个 10 像素的空边框
  3. 创建第二个 JPanel (200 x 200) 并将其添加到 shadowPane 之上
  4. 从 x = 10 和 y = 10 开始绘制一个矩形 (200 x 200)

所以我的问题是 shadowPane 是如何超过 JFrame 的范围的?边框是超出 JFrame 10 像素还是存在于 JFrame 内部。从我发现的所有内容来看,它应该在里面,但是根据这段代码如何在框架后面生成阴影,这没有意义。任何人都可以引导我完成这个吗?谢谢。

最佳答案

So my question in how is the shadowPane going past the range of the JFrame?

不是。 pack 确定内容的首选布局大小并使窗口足够大以容纳它,因为框架是底层涂层并且它的背景是透明的,它“看起来”就像阴影卡在框架上一样,这是一种错觉。

空边框确保添加到 ShadowPane 的内容被“强制”到一个小空间。

让我们稍微修改一下代码...

JFrame frame = new JFrame("Testing");
JPanel content = new JPanel(new BorderLayout());
content.setBackground(Color.RED);
//frame.setUndecorated(true);
//frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(content);
//frame.setContentPane(new ShadowPane());

JPanel panel = new JPanel(new GridBagLayout());
panel.add(new JLabel("Look ma, no hands"));

ShadowPane shadowPane = new ShadowPane();
shadowPane.add(panel);

frame.add(shadowPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

这样做的目的是创建一个新的背景面板,并用红色填充。它还添加了窗口装饰。

Shadow

如您所见,阴影 Pane 和标签都在窗口范围内呈现。

如果我们再次移除窗口装饰...

Shadow

可以看到还是老样子...

这是怎么回事?

getPreferredSize 提供有关组件大小的核心信息(在本例中为 200x200)

EmptyBorderShadowPane 中定义了一个可用空间,它定义了一个可以显示内容的区域,它在组件的右侧和底部留出了 10 个像素,其中组件无法显示。这是由布局管理器自动处理的。这意味着 ShadowPane 本身实际上可以在此处绘制,但添加到其中的组件永远不会在此处显示,因此是阴影板。

基本上,它是烟雾和镜子,用于在添加到框架的内容(或本例中的 ShadowPane)后面生成投影的幻觉

关于java - 边界问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28314744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com