jAVA FRAME

public class Frame
   
    extends 
    Window
   
   
    implements 
    MenuContainer
   
 

Frame 是带有标题和边界的顶层窗口。

frame 的大小包括边界指定的所有区域。边界区域的尺寸可以使用 getInsets 方法获得,但是,由于这些尺寸是与平台相关的,因此在通过调用 packshow 将 frame 设置为可显示的之前,无法获得有效的 insets 值。由于 frame 的总大小包括了边界区,因此边界有效地模糊了 frame 的部分区域,约束了可用于在矩形中呈现和/或显示子部件的区域,矩形左上角的位置为 (insets.left, insets.top),宽度为 width - (insets.left + insets.right),长度为 height - (insets.top + insets.bottom)

frame 的默认布局为 BorderLayout

使用 setUndecorated,frame 可以关闭本机装饰(例如 FrameTitlebar)。只有在 frame 不是 displayable 时才能完成此操作。

在多屏幕环境中,通过使用 Frame(GraphicsConfiguration)Frame(String title, GraphicsConfiguration) 构造 Frame,可以在不同的屏幕设备上创建 FrameGraphicsConfiguration 对象是目标屏幕设备的 GraphicsConfiguration 对象之一。

在虚拟设备多屏幕环境中(其中桌面区域可以跨越多物理屏幕设备),所有配置的边界都是相对于虚拟坐标系统的。虚拟坐标系统的原点位于主物理屏幕的左上角。是否使用负坐标,取决于主物理屏幕在虚拟设备中的位置,如下图所示。

包括三个物理屏幕和一个主物理屏幕的虚拟设备。主物理屏幕
显示坐标为 (0,0),而另一个物理屏幕显示坐标为 (-80,-100)。

在此环境中,调用 setLocation 时,必须传递一个虚拟坐标到此方法中。类似地,对 Frame 调用 getLocationOnScreen 将返回虚拟设备坐标。调用 GraphicsConfigurationgetBounds 方法,以查找它在虚拟坐标系统中的原点。

以下代码将 Frame 的位置设置为 (10, 10)(相对于相应的 GraphicsConfiguration 的物理屏幕的原点)。如果不考虑 GraphicsConfiguration 的边界,则 Frame 的位置将被设置为 (10, 10)(相对于虚拟坐标系统),并出现在主物理屏幕上,主物理屏幕不同于指定的 GraphicsConfiguration 的物理屏幕。

      Frame f = new Frame(GraphicsConfiguration gc);
      Rectangle bounds = gc.getBounds();
      f.setLocation(10 + bounds.x, 10 + bounds.y);
       Rectangle virtualBounds = new Rectangle();
      GraphicsEnvironment ge = GraphicsEnvironment.
              getLocalGraphicsEnvironment();
      GraphicsDevice[] gs =
              ge.getScreenDevices();
      for (int j = 0; j < gs.length; j++) { 
          GraphicsDevice gd = gs[j];
          GraphicsConfiguration[] gc =
              gd.getConfigurations();
          for (int i=0; i < gc.length; i++) {
              virtualBounds =
                  virtualBounds.union(gc[i].getBounds());
          }
      } 

Frame 能够产生以下类型的 WindowEvent

  • WINDOW_OPENED
  • WINDOW_CLOSING:
    在处理事件时,如果程序没有显式地隐藏或移除窗口,则取消窗口关闭操作。
  • WINDOW_CLOSED
  • WINDOW_ICONIFIED
  • WINDOW_DEICONIFIED
  • WINDOW_ACTIVATED
  • WINDOW_DEACTIVATED
  • WINDOW_GAINED_FOCUS
  • WINDOW_LOST_FOCUS
  • WINDOW_STATE_CHANGED

 

 

从以下版本开始:
JDK1.0  
import java.awt.*;
import javax.swing.*;   
/**
 * @author bo.wang
 *
 */
/**
 * @author bo.wang
 *
 */
public class HelloWorldSwing1 {
 public static void main(String[] args) {
  JFrame frame = new JFrame("HelloWorldSwing1");
  //GraphicsConfiguration gc=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
       GraphicsEnvironment ge = GraphicsEnvironment.
               getLocalGraphicsEnvironment();
       GraphicsDevice[] gs =
               ge.getScreenDevices();
           GraphicsDevice gd = gs[0];
           GraphicsConfiguration[] gcall =
               gd.getConfigurations();
           GraphicsConfiguration gc=gcall[0];
  System.out.println(gc.toString());
  Frame f = new Frame(gc);
  Rectangle bounds = gc.getBounds();     
  f.setLocation(1000 + bounds.x, 1000 + bounds.y);
  final JLabel label = new JLabel("Hello World1");
  frame.getContentPane().add(label);
 
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();//缩紧所有组件,使初始打开页面时即可显示所有的组件
  frame.setVisible(true);
 }
}
### JavaFrame 的使用方法及相关解决方案 在 Java 编程中,`Frame` 可以指代多种概念。一方面,它可能是 GUI 开发中的窗口容器(如 AWT/Swing 中的 `java.awt.Frame`),另一方面也可能涉及到多媒体处理框架(如 JavaCV 中的 `org.bytedeco.javacv.Frame`)。以下是针对这两种场景的具体说明: --- #### 1. **AWT/Swing 中的 Frame** 在传统的图形界面开发中,`java.awt.Frame` 是一种顶层容器,用于创建独立的窗口。虽然现代开发更多倾向于使用 `javax.swing.JFrame`,但了解 `Frame` 的基本用法仍然很有价值。 ##### 创建和初始化 Frame 以下是一个简单的示例,展示了如何创建并显示一个 `Frame` 容器[^2]。 ```java import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class SimpleFrameExample { public static void main(String[] args) { Frame frame = new Frame("Simple Frame Example"); // 设置关闭操作 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setSize(400, 300); // 设置尺寸 frame.setVisible(true); // 显示窗口 } } ``` ##### 主要特点 - `Frame` 默认不带装饰边框(无最大化/最小化按钮等),需手动启用。 - 需要显式添加事件监听器来管理窗口行为(如关闭)。 如果希望使用更现代化的功能,推荐使用 `JFrame` 替代 `Frame`。 --- #### 2. **JavaCV 中的 Frame** 在多媒体处理领域,特别是基于 JavaCV 的项目中,`Frame` 表示单个图像或视频帧的数据结构。它是 JavaCV 提供的核心对象之一,广泛应用于音视频捕获、录制以及实时处理任务[^3]。 ##### 基本工作流程 以下是一个完整的代码片段,演示了如何利用 `FFmpegFrameGrabber` 抓取视频帧,并将其保存为新文件。 ```java import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Frame; public class VideoProcessingExample { public static void main(String[] args) throws Exception { String inputPath = "input.mp4"; String outputPath = "output.mp4"; FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputPath); grabber.start(); int width = (int) grabber.getImageWidth(); int height = (int) grabber.getImageHeight(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, width, height); recorder.setFormat("mp4"); recorder.setVideoCodecName("h264"); recorder.start(); Frame frame; while ((frame = grabber.grabFrame()) != null) { if (frame.image != null || frame.samples != null) { recorder.record(frame); } } grabber.stop(); recorder.stop(); grabber.release(); recorder.release(); } } ``` ##### 关键点解析 - **抓取视频流**:通过 `FFmpegFrameGrabber` 实现,支持本地文件或 RTSP 流作为输入源。 - **记录视频流**:借助 `FFmpegFrameRecorder` 将处理后的帧写入目标文件。 - **资源释放**:务必调用 `stop()` 和 `release()` 方法以防止内存泄漏。 对于某些特定问题(如 PPS/SPS 参数丢失引发的错误),可尝试调整配置项或升级依赖库版本[^4]。 --- #### 3. **常见问题及解决方案** | 问题描述 | 可能原因 | 推荐解决办法 | |----------|-----------|---------------| | 视频无法正常播放 | 输入流损坏或参数缺失 | 检查输入源合法性;确认 SPS/PPS 数据是否完整传输 | | 内存占用过高 | 资源未及时释放 | 确保每次循环结束时清理不再使用的变量 | | 录制画面模糊不清 | 输出分辨率设定不当 | 根据原始素材调整宽度高度比例 | --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值