使用 Java 在 GUI 编程中混合 awt 和 swing
Posted
技术标签:
【中文标题】使用 Java 在 GUI 编程中混合 awt 和 swing【英文标题】:mixing awt and swing in GUI programming using Java 【发布时间】:2013-09-25 22:32:50 【问题描述】:我在 SO 上读到混合 awt 和 swing 并不是 Java 中 GUI 编程的好方法。但是,我无法找到任何在使用 swing 时不使用某些 awt 组件的示例。例如,即使使用swing,我遇到的大多数示例都会使用awt进行布局和事件处理。
话虽如此,在使用 Java 的 GUI 编程中不混合 swing 和 awt 意味着什么?这只是意味着不要同时从 swing 和 awt 借用图形小部件,例如按钮、画布,还是完全单独使用 swing 或 awt?还是可以使用 swing 中的图形单元(如按钮、面板)以及 awt 中的事件处理和布局?
大多数情况下,导入至少看起来像这样:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
我可能是错的,但由于我是 Java GUI 的新手,所以我没有看到在没有 awt 的情况下使用完全 swing 的示例或以错误的方式查看此示例。
【问题讨论】:
Swing 在 AWT 之上构建,因此在编写 Swing GUI 时您将使用 AWT 中的许多类。正如您正确推断的那样,“不要混合 Swing 和 AWT”是指不要混合像Frame
和 JFrame
这样的 GUI 组件。你会注意到JFrame
扩展了Frame
。
在使用 Swing 时确实很难避免使用 AWT,因为它是建立在 AWT 之上的。有时你甚至不得不同时使用它们,我认为this 就是一个很好的例子。
@BoristheSpider:感谢您的评论。这有助于我理清思路。您能否详细说明您的评论并发布作为我接受的答案。
@Mast3rPlan:感谢您的链接。
通常,您需要的 awt 组件是***的,甚至不需要直接使用,因为 JFrame 和 JPopupMenu 存在。布局管理器和事件位于 awt 命名空间中,但它们不是组件。
【参考方案1】:
在使用 Swing 时,您将使用 AWT 布局、动作侦听器等 - 这没关系,而且根据设计,Swing 框架在这方面构建在 AWT 之上。这与 JavaFX 形成鲜明对比,JavaFX 本身就是一个完整的 GUI 框架,包含自己的布局、事件处理程序等。
如果可能的话,您应该避免混合放置在 GUI 中的实际 组件 - 例如,在 Frame(而不是 JFrame)中使用 JButton,或者同时使用 Button 和 JButton一边。
在某些情况下这是必要的 - 例如,如果您想使用普通的嵌入式视频播放器,则在 Swing 应用程序中使用 VLCJ 需要重量级 (AWT) 画布。但是,如果没有像上述这样的良好用例,则应该避免这种情况。
【讨论】:
新版本的 Java 混合旧的 AWT(“重量级”)和新的 Swing(“轻量级”)组件应该不是问题:oracle.com/technetwork/articles/java/… @lbalazscs 这些错误中的许多已经解决,但我仍然看到在最新版本的 JRE 中这种混合组件的绘制问题。诚然,在许多情况下,现在它不会成为问题,但除非你有充分的理由这样做,否则我认为没有理由提倡混合使用重量级和轻量级组件 - 没有必要引入在没有充分理由的情况下增加问题的可能性。以上是关于使用 Java 在 GUI 编程中混合 awt 和 swing的主要内容,如果未能解决你的问题,请参考以下文章